टेक्स्ट फ़ाइलों में स्ट्रिंग की खोज कैसे करें?


170

मैं जांच करना चाहता हूं कि क्या कोई स्ट्रिंग एक पाठ फ़ाइल में है। यदि यह है, तो X करें। यदि यह नहीं है, तो Y करें। हालाँकि, यह कोड हमेशा Trueकिसी कारण से लौटता है । क्या कोई देख सकता है कि क्या गलत है?

def check():
    datafile = file('example.txt')
    found = False
    for line in datafile:
        if blabla in line:
            found = True
            break

check()
if True:
    print "true"
else:
    print "false"

जवाबों:


392

कारण जो आपको हमेशा मिला Trueहै वह पहले ही दिया जा चुका है, इसलिए मैं सिर्फ एक और सुझाव दूंगा:

यदि आपकी फ़ाइल बहुत बड़ी नहीं है, तो आप इसे एक स्ट्रिंग में पढ़ सकते हैं, और बस उसी का उपयोग करें (पढ़ने और लाइन से लाइन की जाँच करने की तुलना में अधिक तेज़ और आसान):

with open('example.txt') as f:
    if 'blabla' in f.read():
        print("true")

एक और चाल: आप mmap.mmap()एक "स्ट्रिंग जैसी" वस्तु का उपयोग करके संभावित मेमोरी समस्याओं को दूर कर सकते हैं जो अंतर्निहित फ़ाइल का उपयोग करता है (मेमोरी में पूरी फ़ाइल पढ़ने के बजाय):

import mmap

with open('example.txt') as f:
    s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
    if s.find('blabla') != -1:
        print('true')

ध्यान दें: पायथन 3 में, मिमीपैप्स bytearrayस्ट्रिंग के बजाय ऑब्जेक्ट्स की तरह व्यवहार करते हैं , इसलिए आप जिस चीज की तलाश करते हैं , वह एक स्ट्रिंग के बजाय find()एक bytesऑब्जेक्ट होना चाहिए , जैसे। s.find(b'blabla'):

#!/usr/bin/env python3
import mmap

with open('example.txt', 'rb', 0) as file, \
     mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
    if s.find(b'blabla') != -1:
        print('true')

आप mmapउदाहरण, केस-असंवेदनशील खोज पर नियमित अभिव्यक्ति का उपयोग कर सकते हैं :if re.search(br'(?i)blabla', s):


84
ये जबरदस्त है! यही कारण है कि मैं स्टैकओवरफ़्लो से प्यार करता हूं: यह सिर्फ आपको समाधान नहीं देता है, यह आपको एक बेहतर विकल्प देता है। धन्यवाद :)
HankSmackHood

1
दूसरा समाधान 'blabla' in open('example.txt').read()मेरे अजगर 2.7
xApple

1
अजीब बात है, यह s.find('blabla')(-1 के लिए जांच) के साथ काम करता है । मैं शपथ ले सकता था कि वह इसके साथ भी काम inकरता था ... लेकिन अब ऐसा लगता है कि inकेवल एकल पात्रों के लिए काम करता है ...
स्टीवन

6
if 'blabla' in open('example.txt').read(): print "true"==> हम example.txtइस मामले में फ़ाइल कैसे बंद कर सकते हैं ?

4
openआम तौर पर एक withबयान में समझाया जाना चाहिए :with open(file_name) as fl: return text in fl.read()
ओहाड श्नाइडर

27

जेफरी ने कहा, आप के मूल्य की जांच नहीं कर रहे हैं check()। इसके अतिरिक्त, आपका check()फ़ंक्शन कुछ भी वापस नहीं कर रहा है। अंतर पर ध्यान दें:

def check():
    with open('example.txt') as f:
        datafile = f.readlines()
    found = False  # This isn't really necessary
    for line in datafile:
        if blabla in line:
            # found = True # Not necessary
            return True
    return False  # Because you finished the search without finding

तो आप के उत्पादन का परीक्षण कर सकते हैं check():

if check():
    print('True')
else:
    print('False')

22

संभवतः खोज फ़ंक्शन का उपयोग करके अपने प्रश्न का उत्तर देने का एक और तरीका है जो आपको एक शाब्दिक संख्यात्मक मान देता है जहां वास्तव में कुछ है

open('file', 'r').read().find('')

उस शब्द को लिखने में, जिसे आप ढूंढना चाहते हैं और 'file'अपने फ़ाइल नाम के लिए खड़ा है


11
if True:
    print "true"

हमेशा ऐसा होता है क्योंकि ट्रू हमेशा ट्रू होता है।

आप कुछ इस तरह चाहते हैं:

if check():
    print "true"
else:
    print "false"

सौभाग्य!


मैं देखता हूं, यह अब काम करता है। मेरे लिए थोड़ा अजीब लगता है, इसका मतलब है कि पायथन का कहना है कि "एक मॉड्यूल सच है, जब तक कि अन्यथा न कहा जाए"। इसलिए अगर मैं एक खाली मॉड्यूल बनाऊंगा, तो यह हमेशा सही रहेगा? दिलचस्प :)
हैंकस्मैकहुड

11
नहीं, बिल्कुल नहीं - मॉड्यूल के साथ कुछ नहीं करना है। आप बस जाँच कर रहे थे कि क्या यह सच था, जो यह है।
डैनियल रोसमैन

5

मैंने इस उद्देश्य के लिए एक छोटा सा कार्य किया। यह इनपुट फ़ाइल में एक शब्द खोजता है और फिर इसे आउटपुट फ़ाइल में जोड़ता है।

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • आउटफिट आउटपुट फाइल है
  • inf इनपुट फ़ाइल है
  • स्ट्रिंग बेशक है, वांछित स्ट्रिंग जिसे आप ढूंढना चाहते हैं और आउटफिट में जोड़ना चाहते हैं।

4

आपके checkफ़ंक्शन को foundबूलियन वापस करना चाहिए और इसका उपयोग करना चाहिए कि यह निर्धारित करने के लिए कि क्या प्रिंट करना है।

def check():
        datafile = file('example.txt')
        found = False
        for line in datafile:
            if blabla in line:
                found = True
                break

        return found

found = check()
if found:
    print "true"
else:
    print "false"

दूसरे ब्लॉक को भी संघनित किया जा सकता है:

if check():
    print "true"
else:
    print "false"

1
उपरोक्त सभी उत्तर नाटकीय रूप से आपके अलावा FALSE हैं। मैंने यह अनुमान लगाने के लिए आधे दिन का समय बिताया कि वे उस उत्तर के साथ क्या हो रहे हैं जो उन्होंने पूरी तरह गलत है। केवल तुम्हारा मेरे लिए काम किया

2

दो समस्याएं:

  1. आपका फ़ंक्शन कुछ भी वापस नहीं करता है; एक फ़ंक्शन जो स्पष्ट रूप से कुछ भी नहीं लौटाता है कोई भी नहीं लौटाता है (जो गलत है)

  2. ट्रू हमेशा सच होता है - आप अपने फ़ंक्शन के परिणाम की जांच नहीं कर रहे हैं

def check(fname, txt):
    with open(fname) as dataf:
        return any(txt in line for line in dataf)

if check('example.txt', 'blabla'):
    print "true"
else:
    print "false"

2

फ़ाइल में पाठ की खोज कैसे करें और एक फ़ाइल पथ वापस लाएं जिसमें शब्द पाया जाता है (Как искать часть текста в файле и возвращять путь к фллу в котором это слово найдено)

import os
import re

class Searcher:
    def __init__(self, path, query):
        self.path   = path

        if self.path[-1] != '/':
            self.path += '/'

        self.path = self.path.replace('/', '\\')
        self.query  = query
        self.searched = {}

    def find(self):
        for root, dirs, files in os.walk( self.path ):
            for file in files:
                if re.match(r'.*?\.txt$', file) is not None:
                    if root[-1] != '\\':
                        root += '\\'           
                    f = open(root + file, 'rt')
                    txt = f.read()
                    f.close()

                    count = len( re.findall( self.query, txt ) )
                    if count > 0:
                        self.searched[root + file] = count

    def getResults(self):
        return self.searched

मेन में ()

# -*- coding: UTF-8 -*-

import sys
from search import Searcher

path = 'c:\\temp\\'
search = 'search string'


if __name__ == '__main__':

    if len(sys.argv) == 3:
        # создаем объект поисковика и передаем ему аргументы
        Search = Searcher(sys.argv[1], sys.argv[2])
    else:
        Search = Searcher(path, search)

    # начать поиск
    Search.find()

    # получаем результат
    results = Search.getResults()

    # выводим результат
    print 'Found ', len(results), ' files:'

    for file, count in results.items():
        print 'File: ', file, ' Found entries:' , count

यदि आपके पास इस प्रश्न के बारे में कोई प्रश्न है जिसका उत्तर इस प्रश्नोत्तर द्वारा नहीं दिया गया है, तो कृपया शीर्ष दाएं कोने में एक नया प्रश्न बनाएं।
सुमुरै 8

1

पाया = गलत

def check():
    datafile = file('example.txt')
    for line in datafile:
        if blabla in line:
            found = True
            break
    return found

if check():
    print "true"
else:
    print "false"

1

यदि उपयोगकर्ता दिए गए टेक्स्ट फ़ाइल में शब्द खोजना चाहते हैं।

 fopen = open('logfile.txt',mode='r+')

  fread = fopen.readlines()

  x = input("Enter the search string: ")

  for line in fread:

      if x in line:

          print(line)

0
found = False
def check():
datafile = file('example.txt')
for line in datafile:
    if "blabla" in line:
        found = True
        break
return found

if check():
    print "found"
else:
    print "not found"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.