0

を使用してファイルを読み込んでいます

for line in fin:
    process(line)

ただし、ファイル内のいくつかの行をスキップして、そこから続行したい場合があります。コード内の計算に依存するため、事前に行数はわかりません。だから私はそれが次のようなものになりたいです

for line in fin:
    x = process(line)
    if (x == 23):
        skip back xxx lines and continue

Pythonでこれをどのように行うことができますか?

これは、たとえば mmap で実行できるものですか? ファイルは大きいので、すべてをメモリに保存したくありません。

4

3 に答える 3

1

ファイル オブジェクトの tell() メソッドを使用して、配列内の各行の位置を記録することをお勧めします。これにより、各線に遭遇したときの位置へのオフセットが提供されます。次に、スキップして戻りたい場合は、f.seek() を使用して、指定した場所に逆方向にジャンプします。

例えば:

linestarts = []
f = open(myfile,"r")
...
linestarts.append(f.tell()) # save each line
f.readline()  # do stuff reading a line
...
# want to jump back 3 lines for some reason
f.seek( linestarts[-3] )

もちろん、もう 1 つのオプションは、独自のコードの最後の数行をキャッシュすることですが、それは stdio が既に行っていることです。

于 2013-07-28T20:13:54.023 に答える
0

別のアプローチ:

In [11]: from collections import deque

In [12]: cache = deque(maxlen=max_skip_back)

In [13]: for line in fin:
   ....:     line = line.strip()
   ....:     cache.append(line)
   ....:     x = process(line)
   ....:     if x == 23:
   ....:         for line in cache[-this_skip_back:]:
   ....:             process(line)

これは、ファイル全体をメモリに読み込むわけではありません。よりも長くなると、deques は最初の要素を削除しますmaxlen

于 2013-07-28T19:42:30.300 に答える