Как искать строку в текстовых файлах?

Я хочу проверить, находится ли строка в текстовом файле. Если это так, сделайте 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"

Ответ 1

Причина, по которой вы всегда получали 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')

ПРИМЕЧАНИЕ: в python 3 mmaps ведут себя как объекты 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):

Ответ 2

Как сказал Джеффри Саид, вы не проверяете значение 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')

Ответ 3

Здесь еще один способ ответить на ваш вопрос, используя функцию find, которая дает вам буквальное числовое значение, где что-то действительно есть

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

в поиске напишите слово, которое вы хотите найти и 'file' означает ваше имя файла

Ответ 4

if True:
    print "true"

Это всегда происходит потому, что True всегда прав.

Вы хотите что-то вроде этого:

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

Удачи!

Ответ 5

Ваша функция 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"

Ответ 6

Я сделал небольшую функцию для этой цели. Он ищет слово во входном файле и затем добавляет его в выходной файл.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf - это выходной файл
  • inf - это входной файл Строка
  • - это, конечно, искомая строка, которую вы хотите найти и добавить в outf.

Ответ 7

Две проблемы:

  • Ваша функция ничего не возвращает; функция, которая явно не возвращает ничего, возвращает None (что является ложным)

  • True всегда True - вы не проверяете результат своей функции

.

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"

Ответ 8

Как искать текст в файле и возвращает путь к файлу, в котором находится слово (Как искать часть текста в файле и возвращять путь к файлу в котором это слово найдено)

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

Ответ 9

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"

Ответ 10

Если пользователь хочет найти слово в данном текстовом файле.

 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)