5

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が表示されない場合など、ファイルが終了区切り文字なしで終了すると問題が発生します。より良いアプローチは何ですか?

4

2 に答える 2

10

それがあなたの問題をカバーするはずであるように見える1つのわずかな修正:

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
于 2012-07-31T02:51:55.383 に答える
1

itertoolsモジュールを使用して可能な代替案があります。ここでの質問では[key]をチェックする必要がありますが、ユーザーが事前情報を持っている場合に読み取り開始マーカー
の後の数行をスキップできることを示すためにitertool.islice()も追加しています。

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)
于 2019-08-29T17:21:18.757 に答える