18

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

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)

.next()コードは想定どおりに機能しますが、変数を使用してファイルを呼び出すことが機能する理由はわかりませんheader。csv_file_objectはまだファイル全体ではありませんか?for row in csv_file_object変数ヘッダーが一度定義されると参照されていないように見えるので、が呼び出され たときにプログラムがヘッダー行をスキップすることをどのように知るのですか?

4

5 に答える 5

20

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

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

これがメソッドに関するドキュメントnext()です(これは別の部分です)。

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

于 2013-01-27T19:53:19.453 に答える
6

csv.readerオブジェクトはイテレータです。next()イテレータは、使用可能な次の値を返すか、使用可能な値がない場合に発生するメソッドを持つオブジェクトStopIterationです。はcsv.reader値を1行ずつ返します。

イテレータオブジェクトは、Pythonがforループを実装する方法です。ループの開始時に__iter__、ループオーバーオブジェクトのオブジェクトが呼び出されます。イテレータを返す必要があります。次に、そのオブジェクトのメソッドが呼び出され、メソッドが例外を発生させるnextまで値がループ変数に格納されます。nextStopIteration

この例では、ループ構造で変数を使用する前にnextへの呼び出しを追加することforにより、イテレーターによって返される値のストリームから最初の値を削除しています。

より単純なイテレータでも同じ効果を確認できます。

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
于 2013-01-27T20:00:48.363 に答える
1

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

于 2013-01-27T19:55:17.227 に答える
1

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

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

for row in csv_file_object:
    data.append(row)
于 2013-01-27T20:04:22.677 に答える
0

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

于 2016-03-17T02:33:08.070 に答える