2017-07-10 19 views
0

このコードではlist_of_rows2 listを作成してから、forループを実行します。どのようにforループは実行されませんか?これはちょうどopenの仕組みですか?ここでforループを実行しないのはなぜですか?

infile = r"D:\temp.txt" 

with open(infile) as file2: 

    list_of_rows2 = [x.split() for x in file2] 

    for x in file2: 
     print x 
+0

ファイルとは正確に何をしたいですか? –

+0

何も、私はそれが私がそれを期待したようになぜdidntの仕事を理解していない。 – fpolig01

答えて

5

はい、それはopenの動作です。ファイルオブジェクトにイテレータを返します。一度消耗するまで一度しか反復することはできません。

リスト内包語の最初の反復でファイルイテレータが使い果たされるため、もう一度上書きしようとするときには何も繰り返しません。

これは、ファイル全体を一度にメモリにロードしてメモリ上でプログラムを窒息させないという利点があります。しかし、あなたは(必要であれば)ファイルオブジェクトのreadlinesメソッドを呼び出すことにより、ファイルをメモリにロードすることができます。

with open(infile) as file2: 
    file2 = file2.readlines() # or list(file2) 
    list_of_rows2 = [x.split() for x in file2] 

    for x in file2: 
     print x 

別のオプションは、繰り返し処理の前に、file2.seek(0)を呼び出すことによって、その開始位置にファイルを追求することですもう一度。

+0

偉大な答えは、それをクリアします。ありがとう – fpolig01

+1

あなたの状況に適している場合は、 'file2.seek(0)'を呼び出すことによってイテレータをリセットすることもできます。 – Collin

+0

@Collinはい、それは別の良いオプションです。どのように私はそれを逃しましたか? –

関連する問題