使用CSV阅读器上的list()函数不一致

时间:2012-12-17 21:26:02

标签: python python-2.7

在研究一个常见问题(如何在迭代前查找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

1 个答案:

答案 0 :(得分:6)

当您从list构建generator时会发生这种情况。

  • Generator是一个可迭代的对象,可逐个生成项目。在某些时候它已经筋疲力尽了。

  • csv.reader返回一个生成器。

  • 执行list(generator)时,列表构造函数会使用生成器中的所有项目。

  • 下次尝试从生成器中获取内容时(例如,再次list(generator)执行),它已经用尽了。

你能做什么是 创建一个列表并在需要时使用它:

myCSV = list(csv.reader(open('myFile.txt','rb'),dialect='excel'))
print(len(myCSV))
print(myCSV)