迷惑データのサイズや迷惑メールのスキャンを知らなくても、直接検索することはできません。あなたが実際に、適切に配置ファイルディスクリプタをする必要はありません場合は
import itertools
# Or def a regular function that returns True until you see the line
# delimiting the beginning of the "good" data
not_good = '# The stuff I care about\n'.__ne__
with open(filename) as f:
for line in itertools.dropwhile(not_good, f):
... You'll iterate the lines at and after the good line ...
:しかし、それはすべての残りの行を反復処理した後、あなたが「良い」データが表示されるまでラインを破棄するitertools.dropwhile
でファイルをラップするためにあまりにも難しいことではありませんただの線は、このバリアントは動作するはずです:あなたは本当に(というだけのオフセットを必要とするよりも)それを必要とする場合
import io
with open(filename) as f:
# Get first good line
good_start = next(itertools.dropwhile(not_good, f))
# Seek back to undo the read of the first good line:
f.seek(-len(good_start), io.SEEK_CUR)
# f is now positioned at the beginning of the line that begins the good data
あなたは、実際の行番号を取得するには、これを微調整することができます。しかし、あまり読みにくいので、明示的な反復をenumerate
で実行する必要がある場合は、より意味をなさないかもしれません。あなたのためのPythonの仕事を作るための方法は次のとおりです。
from future_builtins import map # Py2 only
from operator import itemgetter
with open(filename) as f:
linectr = itertools.count()
# Get first good line
# Pair each line with a 0-up number to advance the count generator, but
# strip it immediately so not_good only processes lines, not line nums
good_start = next(itertools.dropwhile(not_good, map(itemgetter(0), zip(f, linectr))))
good_lineno = next(linectr) # Keeps the 1-up line number by advancing once
# Seek back to undo the read of the first good line:
f.seek(-len(good_start), io.SEEK_CUR)
# f is now positioned at the beginning of the line that begins the good data
あなたはそうしているで始まるすべての行をスキップするので、 '例えば#1 F'は、各行の先頭に起こるから動作するように一貫性のある何かを見つける必要がありますifステートメント。あなたが作業できる他のパターンを見つけることができますか? – Sarcoma
問題は#fが必ずしも各行の先頭にあるわけではなく、常に行頭にハッシュタグがあることです。 単なる文字列のように.rfind( '#')を使いたいのですが、文書全体を文字列にすることなくテキスト文書全体に.rfind()を適用する方法がわかりません。 – Destroxia
私はちょうど各行をループし、それぞれの最初の 'char'をチェックします。もしそれが'# 'なのか、他の何かが予測できない場合、内容をヒットしてそこから読み始めます。 – Sarcoma