-3

私はファイルを持っています

Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4

ヘッダー1を読み、その下の3行目と4行目を読み、その後、ヘッダー2を読み、その下の3行目と4行目を別のコンテキストで読みます。どちらの場合も3行目と4行目を検索するための文字列は同じですが、行は完全に同じではありません。現在、私はヘッダー1を使用して検索しています

for line in file    
    if "Header 1" in line:

このファイルのforループ内でreadlineを使用して、4行のブロックを読み取ることができません。

4

2 に答える 2

0

すべての行を保存してから分析します。

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

これにより、必要に応じて行間を簡単にジャンプできますが、ファイルから直接読み取る場合はそうではありません。

于 2013-02-08T13:16:34.803 に答える
0

巻き戻しの答えは、小さなファイルに適しています。一般的な解決策が必要な場合は、イテレータとジェネレータに固執してください。

line_i、line_i+3、line_i+4 のタプルを生成するジェネレーター関数を定義できます。

輸入品で

from collections import deque
from itertools import islice

新しいジェネレーター関数を定義できます。

def reflexive_zip(iterator, offset = 0):
    offset = int(offset)
    if offset == 0:
        for element in iterator:
            yield (element, element)
    else:
        d = deque(islice(iterator,abs(offset)))
        for element in iterator:
            d.append(element)
            if offset < 0:
                yield (element, d.popleft())
            else:
                yield (d.popleft(), element)

を取り、iteratorを使用してバッファを作成し、dequeの要素のタプルを生成しiteratorます。オフセットは引数で制御できoffsetます。

これが完全なスクリプトです。使用例は本文にあります。

if __name__ == "__main__":
    from cStringIO import StringIO

    f = StringIO("""Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4""")

    #for line, other_line in reflexive_zip(f, 4):
    #    print "%s -> %s" %(line, other_line)

    for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3):
        print "%s -> %s    %s" %(line, line3, line4)


from collections import deque
from itertools import islice

def reflexive_zip(iterator, offset = 0):
    offset = int(offset)
    if offset == 0:
        for element in iterator:
            yield (element, element)
    else:
        d = deque(islice(iterator,abs(offset)))
        for element in iterator:
            d.append(element)
            if offset < 0:
                yield (element, d.popleft())
            else:
                yield (d.popleft(), element)

if __name__ == "__main__":
    from cStringIO import StringIO

    f = StringIO("""Header 1
line 1
line 2
line 3
line 4
Header 2
line 1
line 2
line 3
line 4""")

    #for line, other_line in reflexive_zip(f, 4):
    #    print "%s -> %s" %(line, other_line)

    for ((line, _ignore),(line3, line4)) in reflexive_zip(reflexive_zip(f,1),3):
        print "%s -> %s    %s" %(line, line3, line4)

出力:

Header 1
 -> line 3
    line 4

line 1
 -> line 4
    Header 2

line 2
 -> Header 2
    line 1

line 3
 -> line 1
    line 2

line 4
 -> line 2
    line 3

Header 2
 -> line 3
    line 4
于 2013-02-08T14:09:56.313 に答える