-1

読みたい 100000 行ほどの巨大なテキスト ファイルがあります。すべての内容に興味があるわけではありません。「Residue XXX」で始まる行を検索し、そこから次の 3 行を読みたいと思います。バッファ内のリストの行全体を読みたくありません。この行を検索してそこから読み取る効率的な方法はありますか

f=open("result.txt",r)
lines = f.readlines()// NOT preferred

この行を読み取って反復するのではなく、ファイル全体でこの行を検索する方法がある場合は、入力が必要です。

4

4 に答える 4

1

あなたは次のようなものを探しています:

read_lines = None

for l in open("result.txt"):
    if read_lines:
        print l.encode('unicode_escape')
        read_lines -= 1
    if read_lines == 0: 
        break
    if l.startswith('Residue ddG RotamerProbability'):
        read_lines = 3

もっと微妙な解決策がありますが、これは単純明快です。

于 2013-11-01T22:48:23.817 に答える
1
with open("result.txt") as f:
   # find line starting with Residue XXX
   next(line for line in f if not line.startswith("Residue XXX"))
   # get next three lines into a list (empty string for nonexistent lines)
   results = [next(f, "").rstrip() for line in range(3)]

行をリストResidue XXXの最初の項目として保持する場合:results

with open("result.txt") as f:
   # find line starting with Residue XXX
   results = [next(line for line in f if not line.startswith("Residue XXX").rstrip()]
   # add next three lines to the list (empty string for nonexistent lines)
   results.extend(next(f, "").rstrip() for line in range(3))
于 2013-11-02T00:59:59.477 に答える
0

ファイル オブジェクトは反復子であり、別の場所で使用しても続行されます。islice は、イテレータからアイテムを取得するための便利な関数です。すべてをまとめると、for ループを使用して開始位置を見つけ、islice を使用して残りを取得します。

一致した行をリストに含めたいのか、それとも行末をどうしたいのかわからないので、一致した行と次の 3 行を末尾の改行なしで追加することにしました。

from itertools import islice
with open('result.txt') as f:
    for line in f:
        if line.startswith("Residue XXX"):
           my_list = [line.strip()]
           my_list.extend(extra.strip() for extra in islice(f, 3))
           break
于 2013-11-01T23:06:49.197 に答える