3

私はPythonを使用して次の形式のファイルを読み取ります。

iter1
iter2iter3 [n行のデータ]
FLAG =値

iter1
iter2
iter3
iter4iter5 [n行のデータ]
FLAG =値 など...


FLAGを検索し、その値を読み取ってから、「n」行だけ巻き戻して、最後の反復の値を読み取りたいと思います。反復回数が常に同じであるとは限らないことに注意してください。行数'n'は各ファイル内で一貫しています。ただし、これらの行には異なるバイト数が含まれている可能性があるため、シーク機能の使用に問題があります。

私はこのようなことをしたいと思います:

f = open(file)  
for i in f:  
    a = re.search('FLAG')  
    if a:  
          print a  
          spot=f.tell() #mark original spot  
          f.seek(-n,1)  #rewind by n lines  
          b = re.search('iter')  
          print b  
          f.seek(spot) #return to FLAG line, continue to next data set  
4

2 に答える 2

1

あなたの「n行のもの」に「iter」で始まる行が含まれていないと仮定すると、問題は実際よりもはるかに難しくなります。「iter」で始まる最後の行を追跡するだけです。次に、「FLAG =」が表示されたら、そのデータは既にあります。「巻き戻して」探す必要はありません。

lastiterline = None
with open(filename) as f:
    for line in f:
        line = line.strip()
        if line.startswith("iter"):
           lastiterline = line
        elif line.startswith("FLAG"):
           if lastiterline:
               print line
               print lastiterline
           lastiterline = None

一般に、ファイルを 1 回読み取り、後で必要になるビットを覚えておくのが最も簡単です。

于 2012-05-22T22:40:48.290 に答える
0

このような一般的な問題については、ファイルをブロックごとに読み取って処理できます。

def flagblocks(filename):
    with open(filename) as f:
        yieldlist = []
        for line in f:
            if not line.strip():
                continue
            if not line.startswith("FLAG"):
                yieldlist.append(line)
                continue
            yield yieldlist
            yieldlist = []
         yield yieldlist


for flagblock in flagblocks("filename"):
    process_flagblock_lines(flagblock)

あなたの特別な場合の処理​​機能は、kindallが提案したのと基本的に同じです。

関数内のロジックflagblocksが最適でないか、バグがある可能性さえあります。

于 2012-05-22T22:42:25.530 に答える