web-dev-qa-db-ja.com

python csv .next()を理解しようとしています

チュートリアルの一部である次のコードがあります

_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_が呼び出されたときに、プログラムはヘッダー行をスキップすることをどのようにして認識しますか?変数ヘッダーは一度定義されると参照されないように見えるためです?

16
davidheller

next()を呼び出した結果、ヘッダー行は「スキップされました」。これがイテレータの仕組みです。

イテレータをループすると、そのnext()メソッドが毎回呼び出されます。各呼び出しはイテレータを進めます。 forループが始まると、イテレーターはすでに2行目にあり、そこから続きます。

これがnext()メソッドの ドキュメント です( これは別のピースです )。

重要なのは、_csv.reader_オブジェクトがopen()によって返されるファイルオブジェクトと同じようにイテレータであることです。それらを反復することはできますが、特定の瞬間にすべての行(または任意の行)が含まれるわけではありません。

17
Lev Levitsky

_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
_
6

Csv.readerはイテレータです。 .next()を呼び出すと、ファイルを反復処理するときに次の値が取得されます。

以下のコードでは、forループは毎回イテレータで.next()を呼び出し、変数rowの隣に結果を割り当てています。

for row in csv_file_object:
    data.append(row)
1
Matt Alcock

csv.readerはイテレータです。 .nextが呼び出されるたびにcsvから行を読み取ります。ドキュメントは次のとおりです: http://docs.python.org/2/library/csv.html 。イテレータオブジェクトは、実際には一度に読み取るには大きすぎるソースから値を返す可能性があります。イテレータでforループを使用すると、ループを通過するたびに.nextが効果的に呼び出されます。

1
Peter Wooster

Next()の動作はそれ以上で、上記のすべてのエクスポーズは問題​​ありませんが、1つ欠けていることがあります。また、nextを使用して、反復を開始する行からイテレータに指示しているため、問題が発生するとします。すべての行を通過せずに3行目にある値次に簡単に使用できます次の値を取得しましたが、私の場合、最初の行を反復処理する必要がある場合、イテレータが3行目から始まっているかどうかに関係なく、だから、1行目から始めることはできません。方法はありますが、まだ見つかりませんでした。

0
Alain Abrahan