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

JDM*_*JDM 3 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))
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我得到:

> 3
> []
Run Code Online (Sandbox Code Playgroud)

我可以理解为什么你不能只使用list()将阅读器转换为列表列表,但如果是这种情况,那么如何/为什么会len()产生正确的结果呢?

- JDM

Lev*_*sky 6

当你list从a 构建一个时会发生这种情况generator.

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

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

  • 执行此操作时list(generator),列表构造函数将使用生成器中的所有项.

  • 下次你尝试从生成器中获取某些东西时(例如再做list(generator)一次),它已经用尽了.

您可以做的是创建一个列表并在需要时使用它:

myCSV = list(csv.reader(open('myFile.txt','rb'),dialect='excel'))
print(len(myCSV))
print(myCSV)
Run Code Online (Sandbox Code Playgroud)