Если ваш входной файл огромен, вы не можете использовать readlines
, но ничего
не позволяет читать одну строку в цикле.
Поскольку объект file является итеративным, вы можете написать цикл следующим образом:
for line in fh:
и обработать содержимое строки ввода внутри цикла.
Размер файла не важен, так как вы не пытаетесь прочитать все строки сразу.
Для проверки наличия вашей строки (bhuvi
) в строке используйте
re.search
, а не re.findall
.
На самом деле вам не нужен какой-либо список совпадений, достаточно найти
одинарный совпадение (работает быстрее).
Ниже у вас есть пример программы ( Python 3.7 ), пишущий строки, содержащие ваши
строка вместе с номером строки:
import re
cnt = 0
with open('input.txt') as fh:
for line in fh:
line = line.rstrip()
cnt += 1
if re.search('bhuvi', line):
print(f'{cnt}: {line}')
Обратите внимание, что я использовал rstrip()
для удаления завершающего символа новой строки, если таковой имеется.
Редактировать после вашего комментария:
Вы писали, что проверяемый файл огромный . Так что есть риск, что
если вы попытаетесь прочитать это целом в память компьютера, программа
не хватает памяти.
В таком случае вам придется читать файл по частям и
выполнить поиск в каждом чанке отдельно.
Существует также риск того, что строка с текстом, который вы ищете, будет
частично читать в одном фрагменте, а остальные в следующем,
поэтому вы должны принять некоторые меры, чтобы избежать этого в вашей программе.
С другой стороны, если нет другого способа, кроме как использовать mmap ,
попробуйте что-то вроде re.finditer(r'[^\n]*bhuvi[^\n]*', map)
, т.е. создать
итератор ищет:
- Последовательность символов, отличных от \ n .
- Ваша строка.
- Другая последовательность символов, отличная от \ n .
Таким образом, объект соответствия, возвращаемый итератором, будет соответствовать
вся строка , а не ваша строка.