20

「test.txt」というファイルがあります。

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

loop2 はまったく出力されません。

2 つの質問:

  1. open() によって返されたファイル オブジェクトは iterable ですか? それが for ループで使用できる理由ですか?

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

4

5 に答える 5

52

iterableであるだけでなく、 iteratorであるため、ファイルを 1 回しかトラバースできません。多くの人が提案したようにファイルカーソルをリセットすることはできます.seek(0)が、ほとんどの場合、ファイルを 1 回だけ反復する必要があります。

于 2013-06-07T23:57:22.557 に答える
5

はい、ファイル オブジェクトは反復子です。

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

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

于 2013-06-07T23:56:32.080 に答える
3

はい、ファイル オブジェクトはイテラブルですが、ファイルの先頭に戻るには を使用する必要がありlines.seek(0)ます。これは、最初のループの後、ファイルの末尾にいるためです。

于 2013-06-07T23:57:08.673 に答える
1

あなたはすでにファイルの最後にいます。ファイル オブジェクトは反復子です。それらを反復すると、最終的な位置になります。繰り返しは最初から始まりません。1 行目からやり直したい場合は、 を使用する必要がありますlines.seek(0)

于 2013-06-07T23:56:19.310 に答える