[英]Writing Python list to a CSV file clears the list
我正在使用列表, enumerate()
方法和CSV文件进行一些测试。
我正在使用writerows()
方法将枚举对象保存到.csv文件。 一切正常,但列表/枚举对象在写入后变为空。
为什么会这样呢? 如何将值保留在列表中(我必须将其保存在另一个变量中)吗?
我在Windows 10上使用Python 3.6.4
这是我的代码:
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
如果我在编写方法之前执行pre: print(list(c))
,则c
也将变为空。
谢谢!
c = enumerate(b)
这里的c
不是list
而是生成器,当您对其进行迭代时会消耗它。
每次使用时,您都必须创建一个新的生成器。
如果要永久引用生成器的用尽内容,则必须将其转换为list
。
c = list(enumerate(b))
那是完全正常的。 c
是一个生成器,它将对b
所有元素进行迭代,因此它将仅对b
一次迭代。 那就是当您调用writer.writerows(c).
之后,生成器将耗尽,因此从中生成list
将返回一个空列表。
[Python]: 枚举 ( 可迭代,start = 0 )返回一个generator 。
来自[Python]:生成器 :
使用生成器可以提高性能,这是由于值的延迟(按需)生成的结果,这转化为较低的内存使用量。 此外,我们不需要等到所有元素生成后再开始使用它们。 这类似于迭代器提供的好处,但是生成器使构建迭代器变得容易。
...
注意:只有当我们不打算多次使用该组生成的值时,生成器才会提供性能优势。
迭代器生成器的值将被使用。 这就是为什么您必须通过例如将其转换为列表来“保存”它的原因(因为它会在其上进行迭代,因此也会消耗它)。
有关更多详细信息,您还可以检查[SO]:如何列出目录的所有文件? (@CristiFati的答案-第一部分) (“ 预备知识”部分-在此说明[Python]的行为: map ( function,iterable,... ) )。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.