2016-07-08 9 views
1

ファイルを解析しようとしていますが、常に存在する部分があり、過去の部分はオプションです。EOFで正常終了する

for line in finp: 
    # This part is always present 
    for _ in range(int(ldata[2])): 
     sdata = finp.readline() 
     tdos.write(sdata) 


    #This part may or may not be present 
    for i in range(int(atoms)): 
     next(finp) 
     for j in range(int(ldata[2])): 
      aatom[i][j] = [float(x) for x in 
          finp.readline().strip().split()] 

問題は、あるオプションの一部が存在しない場合、next(finp)はエラーを与えている:

next(finp) 
StopIteration 

私が試してみました:

for i in range(int(atoms)): 
    if i is not None: 
     next(finp) 
     for j in range(int(ldata[2])): 
      aatom[i][j] = [float(x) for x in 
          finp.readline().strip().split()] 
    else: 
     break 

しかし、それは問題を解決していません。私はthisのような同じ質問で多くの以前の質問を見つけましたが、この問題を解決することはできません。

これを解決する唯一の方法は、受け入れられたansに記載されているとおり、ファイル全体を一度に読み込んで処理することですか?

答えて

4

next()に戻るには、デフォルトを与える:

next(finp, None) 

第二引数が与えられると、next()キャッチStopIteration例外になり、代わりにその第二引数を返します。

代わりに自分自身StopIterationをキャッチします。おそらくあなたは、その時点でループから抜け出すにしたい:あなたもfile.readline()next(file)を混合している

try: 
    next(finp) 
except StopIteration: 
    break 

注意。 Python 2の実装の詳細のため、これらの2つのメソッドがでなく、のキャッシュを共有するため、予期しない動作に陥ります。ここでnext()を使用することに固執してください(forループはイテレータとしてfileも扱います)。 File Objectsドキュメントを参照してください:

In order to make a for loop the most efficient way of looping over the lines of a file (a very common operation), the next() method uses a hidden read-ahead buffer. As a consequence of using a read-ahead buffer, combining next() with other file methods (like readline()) does not work right. However, using seek() to reposition the file to an absolute position will flush the read-ahead buffer.

あなたはこの警告を無視することができますが、あなたはまだ2つのアプローチのいずれかを使用にこだわったほうが良いと思いますのPython 3を使用している場合。

関連する問題