質問

別のプログラムからのエラーを記録し、エラーが発生したときに中断したところからプログラムを再起動するスクリプトを書いています。何らかの理由で、このプログラムの開発者は、デフォルトでこの機能をプログラムに組み込む必要があるとは感じていませんでした。

とにかく、プログラムは入力ファイルを取得して解析し、出力ファイルを作成します。入力ファイルは特定の形式です:

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
    ...

他のヒント

for および enumerate を使用します。

例:

for line_num, line in enumerate(file):
    if line_num < cut_off:
        print line

:これは、ファイルハンドルなどを既にクリーンアップしていることを前提としています。

また、 takewhile 関数は、より機能的なフレーバー。

必要なのは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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top