チュートリアルの一部である次のコードがあります
_import csv as csv
import numpy as np
csv_file_object = csv.reader(open("train.csv", 'rb'))
header = csv_file_object.next()
data = []
for row in csv_file_object:
data.append(row)
data = np.array(data)
_
コードは想定どおりに機能しますが、変数header
を使用してファイルに対して.next()
を呼び出す理由が明確ではありません。 csv_file_objectはまだファイル全体ではありませんか? _for row in csv_file_object
_が呼び出されたときに、プログラムはヘッダー行をスキップすることをどのようにして認識しますか?変数ヘッダーは一度定義されると参照されないように見えるためです?
next()
を呼び出した結果、ヘッダー行は「スキップされました」。これがイテレータの仕組みです。
イテレータをループすると、そのnext()
メソッドが毎回呼び出されます。各呼び出しはイテレータを進めます。 for
ループが始まると、イテレーターはすでに2行目にあり、そこから続きます。
これがnext()
メソッドの ドキュメント です( これは別のピースです )。
重要なのは、_csv.reader
_オブジェクトがopen()
によって返されるファイルオブジェクトと同じようにイテレータであることです。それらを反復することはできますが、特定の瞬間にすべての行(または任意の行)が含まれるわけではありません。
_csv.reader
_オブジェクトはイテレータです。イテレータはnext()
メソッドを持つオブジェクトであり、次に使用可能な値を返すか、使用可能な値がない場合はStopIteration
を発生させます。 _csv.reader
_は、行ごとに値を返します。
イテレータオブジェクトは、pythonがfor
ループを実装する方法です。ループの開始時に、ループされたオブジェクトの___iter__
_オブジェクトが呼び出されます。これは、次に、そのオブジェクトのnext
メソッドが呼び出され、next
メソッドがStopIteration
例外を発生させるまで、値がループ変数に格納されます。
この例では、for
ループ構造で変数を使用する前にnextへの呼び出しを追加することにより、イテレーターによって返された値のストリームから最初の値を削除しています。
より単純なイテレータで同じ効果を見ることができます:
_iterator = [0, 1, 2, 3, 4, 5].__iter__()
value = iterator.next()
for v in iterator:
print v,
1 2 3 4 5
print value
0
_
Csv.readerはイテレータです。 .next()を呼び出すと、ファイルを反復処理するときに次の値が取得されます。
以下のコードでは、forループは毎回イテレータで.next()を呼び出し、変数rowの隣に結果を割り当てています。
for row in csv_file_object:
data.append(row)
csv.readerはイテレータです。 .nextが呼び出されるたびにcsvから行を読み取ります。ドキュメントは次のとおりです: http://docs.python.org/2/library/csv.html 。イテレータオブジェクトは、実際には一度に読み取るには大きすぎるソースから値を返す可能性があります。イテレータでforループを使用すると、ループを通過するたびに.nextが効果的に呼び出されます。
Next()の動作はそれ以上で、上記のすべてのエクスポーズは問題ありませんが、1つ欠けていることがあります。また、nextを使用して、反復を開始する行からイテレータに指示しているため、問題が発生するとします。すべての行を通過せずに3行目にある値次に簡単に使用できます次の値を取得しましたが、私の場合、最初の行を反復処理する必要がある場合、イテレータが3行目から始まっているかどうかに関係なく、だから、1行目から始めることはできません。方法はありますが、まだ見つかりませんでした。