How to search for a string in text files?

后端 未结 12 2285
死守一世寂寞
死守一世寂寞 2020-11-22 04:29

I want to check if a string is in a text file. If it is, do X. If it\'s not, do Y. However, this code always returns True for some reason. Can anyone see what i

相关标签:
12条回答
  • 2020-11-22 05:07

    Two problems:

    1. Your function does not return anything; a function that does not explicitly return anything returns None (which is falsy)

    2. True is always True - you are not checking the result of your function

    .

    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"
    
    0 讨论(0)
  • 2020-11-22 05:09

    Here's another. Takes an absolute file path and a given string and passes it to word_find(), uses readlines() method on the given file within the enumerate() method which gives an iterable count as it traverses line by line, in the end giving you the line with the matching string, plus the given line number. Cheers.

      def word_find(file, word):
        with open(file, 'r') as target_file:
            for num, line in enumerate(target_file.readlines(), 1):
                if str(word) in line:
                    print(f'<Line {num}> {line}')
                else:
                    print(f'> {word} not found.')
    
    
      if __name__ == '__main__':
          file_to_process = '/path/to/file'
          string_to_find = input()
          word_find(file_to_process, string_to_find)
    
    0 讨论(0)
  • 2020-11-22 05:11

    Here's another way to possibly answer your question using the find function which gives you a literal numerical value of where something truly is

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

    in find write the word you want to find and 'file' stands for your file name

    0 讨论(0)
  • 2020-11-22 05:16

    The reason why you always got True has already been given, so I'll just offer another suggestion:

    If your file is not too large, you can read it into a string, and just use that (easier and often faster than reading and checking line per line):

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

    Another trick: you can alleviate the possible memory problems by using mmap.mmap() to create a "string-like" object that uses the underlying file (instead of reading the whole file in memory):

    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')
    

    NOTE: in python 3, mmaps behave like bytearray objects rather than strings, so the subsequence you look for with find() has to be a bytes object rather than a string as well, eg. 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')
    

    You could also use regular expressions on mmap e.g., case-insensitive search: if re.search(br'(?i)blabla', s):

    0 讨论(0)
  • 2020-11-22 05:17

    found = False

    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"
    
    0 讨论(0)
  • 2020-11-22 05:22

    How to search the text in the file and Returns an file path in which the word is found (Как искать часть текста в файле и возвращять путь к файлу в котором это слово найдено)

    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
    

    In Main()

    # -*- 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
    
    0 讨论(0)
提交回复
热议问题