27

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

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

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: Mixing iteration and read methods would lose data. これを適切に行う方法を知っている人はいますか?

4

4 に答える 4

50

あなたのコードはおそらくfor line in original:に加えて、ValueError を取得しますoriginal.readline()。プログラムを遅くしたり、メモリを消費したりせずに問題を解決する簡単な解決策が変わりつつあります

for line in original:
    ...

while True:
    line = original.readline()
    if not line: break
    ...
于 2009-05-05T19:47:25.577 に答える
12

を使用forして列挙します。

例:

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

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

また、より機能的なフレーバーを好む場合は、 takewhile関数が役立ちます。

于 2009-05-05T19:23:58.580 に答える
0

必要な行が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エラーをキャッチすることをお勧めします(ファイルの行数が少ない場合)。

于 2009-05-06T08:02:56.243 に答える