繁体   English   中英

将Python列表写入CSV文件可清除列表

[英]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]的行为mapfunction,iterable,... )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM