Python читает определенные строки текста между двумя строками

У меня возникли проблемы с тем, чтобы python читал определенные строки. Я работаю над чем-то вроде этого:

lines of data not needed
lines of data not needed
lines of data not needed

--------------------------------------
    ***** REPORT 1 *****
--------------------------------------

[key] lines of interest are here
[key] lines of interest are here
[key] lines of interest are here
[key] lines of interest are here
[key] lines of interest are here      #This can also be the EOF

--------------------------------------    
    ***** REPORT 2 *****
--------------------------------------

lines of data not needed
lines of data not needed
lines of data not needed         #Or this will be the EOF

То, что я пытался, было чем-то вроде:

flist = open("filename.txt").readlines()

for line in flist:
  if line.startswith("\t**** Report 1"):
    break
for line in flist:
  if line.startswith("\t**** Report 2"):
    break
  if line.startswith("[key]"):
    #do stuff with data

Однако у меня есть проблема, когда файл заканчивается без конечного разделителя... Например, когда отчет № 2 не отображается. Какой подход лучше?


person user1443368    schedule 31.07.2012    source источник


Ответы (2)


Одна небольшая модификация, которая выглядит так, как будто она должна решить вашу проблему:

flist = open("filename.txt").readlines()

parsing = False
for line in flist:
    if line.startswith("\t**** Report 1"):
        parsing = True
    elif line.startswith("\t**** Report 2"):
        parsing = False
    if parsing:
        #Do stuff with data 

Если вы хотите избежать синтаксического анализа самой строки "* Report 1"..., просто поставьте начальное условие после if parsing, т.е.

flist = open("filename.txt").readlines()

parsing = False
for line in flist:

    if line.startswith("\t**** Report 2"):
        parsing = False
    if parsing:
        #Do stuff with data 
    if line.startswith("\t**** Report 1"):
        parsing = True
person jmetz    schedule 31.07.2012
comment
мне нравится :) завтра попробую - person user1443368; 31.07.2012
comment
Или вы можете поместить оператор continue после parsing = True, чтобы не анализировать строку «***Report 1****». - person mgilson; 31.07.2012
comment
@mgilson: Хотя я согласен с тем, что продолжение цикла неэффективно ... почему вы предложили continue вместо break? - person jmetz; 20.03.2016

Вот возможная альтернатива с использованием модуля itertools.
Хотя здесь вопрос требует проверки [ключа], я также добавляю itertool.islice(), чтобы показать, что можно пропустить несколько строк после start- чтение маркера, когда у пользователя есть предварительная информация.

from itertools import takewhile, islice, dropwhile

with open('filename.txt') as fid:
    for l in takewhile(lambda x: '***** REPORT 2 *****' not in x, islice(dropwhile(lambda x: '***** REPORT 1 *****' not in x, fid), 1, None)):
        if not '[key]' in l:
            continue
        print(l)
person Peruz    schedule 29.08.2019