3

よくある質問 (反復する前に CSV リーダーの行数を見つける方法) のオプションを調査しているときに、len(list(myCSVReader)). はい、私はこれがいかに不格好で潜在的に高価であることを知っています。しかし、それで遊んでいるうちに、私は本当に不可解な矛盾に出くわしました:

#myFile.txt is a 3-line CSV file
myCSV = csv.reader(open('myFile.txt','rb'),dialect='excel')
print(len(list(myCSV)))
print(list(myCSV))

これを実行すると、次のようになります。

> 3
> []

リーダーをリストのリストに変換するために使用できなかった理由は理解できますがlist()、その場合、これを使用するとどのように/なぜlen()正しい結果が得られるのでしょうか?

-- JDM

4

1 に答える 1

6

listからを構築すると、このようになりますgenerator

  • Generator は、アイテムを 1 つずつ生成する反復可能なオブジェクトです。ある時点でそれは使い果たされます。

  • csv.readerジェネレータを返します。

  • を実行するlist(generator)と、リスト コンストラクターはジェネレーターからのすべてのアイテムを消費します。

  • 次にジェネレーターから何かを取得しようとすると (たとえば、list(generator)別の機会に行う)、既に使い果たされています。

できることは、リストを一度作成して、必要な場所で使用することです。

myCSV = list(csv.reader(open('myFile.txt','rb'),dialect='excel'))
print(len(myCSV))
print(myCSV)
于 2012-12-17T21:28:58.277 に答える