非常に大きなASCIIファイルを「マップ」しようとしています。基本的に、特定のタグが見つかるまで行を読み、そのタグの位置を知りたいので、後でもう一度検索して関連データを引き出すことができます。
from itertools import dropwhile
with open(datafile) as fin:
ifin = dropwhile(lambda x:not x.startswith('Foo'), fin)
header = next(ifin)
position = fin.tell()
今、これtell
は私に正しい位置を与えません。この質問は、以前にさまざまな形で尋ねられました。その理由はおそらく、python がファイル オブジェクトをバッファリングしているためです。したがって、python は、ファイル ポインタがどこにあるかではなく、ファイル ポインタがどこにあるかを教えてくれます。 このバッファリングをオフにしたくない... ここでのパフォーマンスは重要です。ただし、python がバッファすることを選択したバイト数を決定する方法があるかどうかを知っておくとよいでしょう。私の実際のアプリケーションでは、 で始まる行を閉じていればFoo
問題ありません。あちこちに数行をドロップできます。だから、私が実際にやろうとしていることは次のようなものです:
position = fin.tell() - buffer_size(fin)
バッファサイズを見つける方法はありますか?