Вопрос-Ответ

How to search for a string in text files?

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

Я хочу проверить, есть ли строка в текстовом файле. Если есть, сделайте 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 mmap ведут себя как 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_to_search_into', 'r').read().find('searched_string')
Ответ 4
if True:
print "true"

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

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

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

Удачи!

python