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