1

次のようなデータのブロックを含む大きなtxtファイルがあります。

AB x u z

1  0.00 1.00 4.23

2  0.34 2.33 1.44

3  4.23 3.55 6.22

AC x u z



AB x u z

1  0.88 1.00 4.27

2  0.36 2.33 1.44

3  4.23 3.55 6.22

AC x u z



AB x u z

1  0.66 1.77 8.23

2  0.44 2.33 1.44

3  4.23 3.55 6.44

AC x u z



AB x u z

1  0.44 1.99 8.22

2  0.34 2.33 1.44

3  4.23 3.55 6.22

AC x u z

私はPython2.7(この言語の新機能)を使用しています。たとえば、3番目のデータブロックの「ABxuz」と「ACxuv」の行の間の行を抽出し、これらの行を別のファイルに出力する必要があります。

4

3 に答える 3

2

次のようなものを試すことができます:

stored = []
with open("test.py") as f:
    for line in f:
        if line.startswith("AB x u z"):
            block = []
        elif line.startswith("AC x u z"):
            stored.append(block)
        else:
            block.append(line)

ブロックのリスト ( stored) を作成し、各ブロックに"AB x u z"との間の行を含めるという考え方です"AC x u z"。を使用して空行を取り除きたい場合があることに注意してください

elif line.strip():
    block.append(line)

最後のテストとして。

ループを使用しているためfor...、ファイル全体をメモリにロードしません (ファイルが大きい場合は問題になる可能性があります)。ステートメントは、with...読み取り時にファイルを自動的に閉じます。

編集 コメントで指摘されているように、stored最終的にはファイル全体がメモリに格納されます。ただし、特定のブロックのみを保存する必要がある場合は、終了行を見つけるたびにインクリメントするカウンターをいつでも使用できます。"AC x u z"このカウンターの値が特定の要件を満たしている場合、たとえば、counter=3ブロックを保存します。繰り返します。

于 2012-09-23T12:54:01.493 に答える
1

@paulc、あなたはおそらくこれをすでに整理しているでしょうが、私は自分のコードを「新しい人」として共有したかっただけです

BLOCK_THREE = '3'
outStr = ""

# Read Data File
with open('rough_data.txt', 'r') as srcFile:
    for lnReader in srcFile:
        if lnReader.startswith(BLOCK_THREE):
            outStr += lnReader # lnReader reads each line as a String
        else:
            pass

# Write Data to a file
ofile = open('extracts2.txt', 'w')
ofile.write(u'' + outStr)
ofile.close()
print 'end'
于 2013-01-14T11:01:15.097 に答える
0
F = open ('yourfile.txt', 'r')

data = F.read.split('\n\n') #Assuming that there's two newlines between every 'block'

これにより、リストのすべての場所に「ブロック」を含むリスト (データ) が得られます。

于 2012-09-23T12:47:04.157 に答える