在研究一个常见问题(如何在迭代之前找到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
当你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)
| 归档时间: |
|
| 查看次数: |
190 次 |
| 最近记录: |