2013-06-07 13 views
5

ファイルオブジェクトです:は、私はファイル "test.txtという" がpythonで反復可能な

this is 1st line 
this is 2nd line 
this is 3rd line 

次のコード

lines = open("test.txt", 'r') 
for line in lines: 
    print "loop 1:"+line 
for line in lines: 
    print "loop 2:"+line 

のみプリント:

loop 1:this is 1st line 

loop 1:this is 2nd line 

loop 1:this is 3rd line 

それはdoesnのtループ2を印刷します。

つの質問:

  1. (オープンで返されるファイルオブジェクト)、それは反復可能なのですか?それがなぜforループで使用できるのですか?

  2. なぜloop2がまったく印刷されないのですか?

答えて

24

それだけでなく、反復可能あり、それが一度だけファイルを横切ることができる理由ですイテレータ、です。 .seek(0)でファイルカーソルをリセットすることができますが、多くの場合、ファイルを1回だけ反復する必要があります。

+1

+1 iterable-iteratorのことについての素敵で簡潔な記述(他のほとんどの答えは試していないが、質問の鍵だが)。 – abarnert

+0

その説明をありがとう。 – martinbshp

1

あなたは既にファイルの最後にあります。ファイルオブジェクトはイテレータです。あなたがそれらを反復すると、あなたは最終的な位置にいます。繰り返すことは最初から始まらない。 1行目からもう一度やりたい場合は、lines.seek(0)を使用する必要があります。

+0

これは誤解を招くことです。 'list'sもiterableですが、' seek'や同等の機能を使わずに繰り返し処理することができます。問題は、ファイルオブジェクトが_iterators_(iterablesであると同時に)であることです。 – abarnert

+0

Typo。私はイテレーターを意味しました。ありがとう。一定。 –

2

はい、ファイルオブジェクトはイテレータです。

すべてのイテレータと同様に、を1回だけにループすることができます。その後、イテレータが使い果たされます。ファイルの読み込みポインタは、ファイルの最後にあります。再度ループする必要がある場合は、ファイルを再度開くか、.seek(0)を使用してファイルポインタを巻き戻します。

また、ファイルを2回ループしないようにしてください。最初のループ中に必要なものを別のデータ構造(リスト、辞書、セット、ヒープなど)に抽出します。

2

はい、ファイルオブジェクトはイテラブルですが、最初のループの後にファイルの最後にあるので、lines.seek(0)を使用する必要があるファイルの先頭に戻ってください。

0

ファイルを2度反復する必要がないようにコードを書き直す方が良いでしょう。すべての行を何らかの種類のリストに読み込むか、すべての処理を1つのループで実行します。

関連する問題