ファイルとループの混合
-
05-07-2019 - |
質問
別のプログラムからのエラーを記録し、エラーが発生したときに中断したところからプログラムを再起動するスクリプトを書いています。何らかの理由で、このプログラムの開発者は、デフォルトでこの機能をプログラムに組み込む必要があるとは感じていませんでした。
とにかく、プログラムは入力ファイルを取得して解析し、出力ファイルを作成します。入力ファイルは特定の形式です:
UI - 26474845
TI - the title (can be any number of lines)
AB - the abstract (can also be any number of lines)
プログラムがエラーをスローすると、エラーを追跡するために必要な参照情報、つまりUI、どのセクション(タイトルまたは要約)、およびタイトルまたは要約の先頭に相対的な行番号が表示されます。参照番号とファイルを取得し、文を見つけてログに記録する関数を使用して、入力ファイルから問題のある文をログに記録します。私がそれを考える最良の方法は、ファイルを特定の回数(つまり、n回、nはセクションの先頭からの相対的な行番号)進むことです。これを行うのに理にかなっていると思われる方法は次のとおりです。
i = 1
while i <= lineNumber:
print original.readline()
i += 1
これがどのようにデータを失うのかわかりませんが、Pythonはそれを考えており、 ValueError:反復メソッドと読み取りメソッドを混在させるとデータが失われる
と言います。誰でもこれを適切に行う方法を知っていますか?
解決
コードにはおそらく original.readline()
に加えて original for line:
があるため、ValueErrorが発生します。プログラムを遅くしたり、より多くのメモリを消費したりせずに問題を修正する簡単なソリューションが変更されています
for line in original:
...
to
while True:
line = original.readline()
if not line: break
...
他のヒント
必要なのは1行だけであると仮定すると、これは助けになる可能性があります
import itertools
def getline(fobj, line_no):
"Return a (1-based) line from a file object"
return itertools.islice(fobj, line_no-1, line_no).next() # 1-based!
>>> print getline(open("/etc/passwd", "r"), 4)
'adm:x:3:4:adm:/var/adm:/bin/false\n'
StopIterationエラーをキャッチしたい場合があります(ファイルの行数が少ない場合)。
これは、ugい while True
パターンがなく、他のモジュールもないバージョンです。
for line in iter(original.readline, ''):
if …: # to the beginning of the title or abstract
for i in range(lineNumber):
print original.readline(),
break