我正在使用列表,enumerate()
方法和CSV文件进行一些测试。
我正在使用writerows()
方法将枚举对象保存到.csv文件中。
一切正常,但列表/枚举对象在写完后变为空。
为什么会这样? 如何将值保存在列表中(我是否必须将它们保存在其他变量中)?
我在使用Python 3.6.4的Windows 10上
这是我的代码:
import csv
b = [1,2,3,4,5,6,7,8,9,10,11,"lol","hello"]
c = enumerate(b)
with open("output.csv", "w", newline='') as myFile:
print("Writing CSV")
writer = csv.writer(myFile)
writer.writerows(c)
print(list(c))
输出:
>>>Writing CSV
>>>[]
>>>[Finished in 0.1s
如果我在写作方法之前预先形成:print(list(c))
,c
也会变空。
谢谢!
答案 0 :(得分:4)
c = enumerate(b)
此处c
不是list
,而是一个生成器,当您迭代它时会消耗它。
每次使用时都必须创建新的生成器。
如果您想要永久引用生成器的耗尽内容,则必须将其转换为list
。
c = list(enumerate(b))
答案 1 :(得分:1)
这是完全正常的。 c
是一个生成器,它将迭代b
的所有元素,因此它只会迭代b
一次。那是你致电writer.writerows(c).
之后,生成器耗尽,因此从其中list
将返回一个空列表。
答案 2 :(得分:1)
[Python]: enumerate(iterable, start=0)会返回生成器。
使用生成器的性能提升是懒惰(按需)生成值的结果,这意味着更低的内存使用率。此外,在开始使用它们之前,我们不需要等到所有元素都已生成。这类似于迭代器提供的好处,但是生成器使构建迭代器变得容易。
...注意:只有当我们不打算使用那组生成的值时,生成器才会提供性能优势不止一次。
一旦迭代,生成器的值就会被消耗掉。这就是你必须通过例如“保存”它的原因。将它转换为一个列表(它也会消耗它,因为它会迭代它)。
有关详细信息,您还可以查看[SO]: How do I list all files of a directory? (@CristiFati's answer - Part One)(初步说明部分 - 我在其中说明了[Python]: map(function, iterable, ...)的行为)。