Как прочитать предыдущие строки в Python относительно поиска, найденного в файле журнала? - PullRequest
0 голосов
/ 21 февраля 2019

Я новичок в Python, поэтому просто пытаюсь что-то с ним сделать.
У меня огромный файл, в котором после поиска поисковой фразы я должен вернуться на n строк и получить начало текста, начальный тег,После этого начните чтение с этой позиции.

Фразы могут встречаться несколько раз.И есть несколько начальных тегов.Пожалуйста, найдите образец файла, как показано ниже:

<module>
hi
flowers
<name>xxx</name>
<age>46</age>
</module>
<module>
<place>yyyy</place>
<name>janiiiii</janii>
</module>

Предположим, что поиск есть, и мне нужно вернуться к строке, как только я буду искать.Границы между & будут меняться, они не являются статичными.Поэтому, как только я найду имя, мне нужно вернуться к строке модуля и начать его чтение.

Пожалуйста, найдите следующий код:

from itertools import islice
lastiterline=none
line_num=0
search_phrase="Janiii"
with open ('c:\sample.txt',"rb+") as f:
      for line in f:
          line_num+=1
     line=line.strip()
        if line.startswith("<module>"):
           lastiterline=line
           linec=line_num
        elif line find(search_phrase)>=0:
             if lastiterline:
             print line
             print linec

Это поможет мне получить номер строкимодуль, соответствующий поисковому слову. Но я не могу переместить указатель назад, чтобы снова начать чтение строк из модуля.Будет несколько поисковых фраз, поэтому каждый раз мне нужно возвращаться к этой строке, не разбивая основной файл, который читает весь огромный файл.

Например: может быть 100 тегов модулей, и внутри меня может быть 10 поисковых фраз, которые мне нужны, поэтому мне просто нужны эти 10 тегов модулей.

1 Ответ

0 голосов
/ 21 февраля 2019

Хорошо, вот пример для вас, так что вы можете быть более конкретным с тем, что вам нужно.

Это пример вашего huge_file.txt:

wgoi jowijg
<start tag>
wfejoije jfie
fwjoejo
THE PHRASE
jwieo
<end tag>
wjefoiw wgworjg
<start tag>
wjgoirg 
<end tag>
<start tag>
wfejoije jfie
fwjoejo
woeoj
jwieo
THE PHRASE
<end tag>

и сценарияread_prev_lines.py:

hugefile = open("huge_file.txt", "r")
hugefile = hugefile.readlines()

start_locations = []
current_block = -1
for idx, line in enumerate(hugefile):
  if "<start tag>" in line:
    start_locations.append({"start": idx})
    current_block += 1
  if "THE PHRASE" in line:
    start_locations[current_block]["phr"] = idx
  if "<end tag>" in line:
    start_locations[current_block]["end"] = idx

#for i in phrase_locations:
for idx in range(len(start_locations)):
  if "phr" in start_locations[idx].keys():
    print("Found THE PHRASE after %d start tag(s), at line %d:" % (idx, start_locations[idx]["phr"]))
    print("Here is the whole block that contains the phrase:")
    print(hugefile[start_locations[idx]["start"]: start_locations[idx]["end"]+1])
...