Я хочу проверить, есть ли строка в текстовом файле. Если есть, сделайте X. Если нет, сделайте Y. Однако этот код всегда возвращает True по какой-то причине. Кто-нибудь может увидеть, что не так?
defcheck(): datafile = file('example.txt') found = False for line in datafile: if blabla in line: found = True break
check() ifTrue: print"true" else: print"false"
Переведено автоматически
Ответ 1
Причина, по которой вы всегда получали True, уже была указана, поэтому я просто предложу другое предложение:
Если ваш файл не слишком большой, вы можете преобразовать его в строку и просто использовать это (проще и часто быстрее, чем читать и проверять строку за строкой):
withopen('example.txt') as f: if'blabla'in f.read(): print("true")
Еще один трюк: вы можете устранить возможные проблемы с памятью, используя mmap.mmap() для создания "строкового" объекта, который использует базовый файл (вместо чтения всего файла в памяти):
import mmap
withopen('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
withopen('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() функция ничего не возвращает. Обратите внимание на разницу:
defcheck(): withopen('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 returnTrue returnFalse# Because you finished the search without finding
Затем вы можете протестировать вывод check():
if check(): print('True') else: print('False')
Ответ 3
Вот еще один способ ответить на ваш вопрос, используя функцию find, которая дает вам буквальное числовое значение того, где что-то действительно находится