Вернуть точные строки огромного файла после сопоставления с образцом без использования FOR в Python3 - PullRequest
0 голосов
/ 16 сентября 2018

Я новичок в Python.Моя проблема здесь в следующем: я хочу сопоставить шаблон с большим файлом и вернуть из него совпадающие строки (а не только совпадающую строку).Я не хочу цикл FOR для этого, поскольку мой файл огромен.Я использую mmap для чтения файла.

Sample File

в вышеуказанном файле, если я ищу bhuvi , я должен получить 2 строки, bhuvi и bhuvi Kumar

Я использовал для этого re.findall (), но он просто возвращает подстроки, а не целые строки.

Может кто-нибудь подсказать, что яможно тут сделать?

1 Ответ

0 голосов
/ 16 сентября 2018

Если ваш входной файл огромен, вы не можете использовать 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), т.е. создать итератор ищет:

  1. Последовательность символов, отличных от \ n .
  2. Ваша строка.
  3. Другая последовательность символов, отличная от \ n .

Таким образом, объект соответствия, возвращаемый итератором, будет соответствовать вся строка , а не ваша строка.

...