【问题标题】:Writing Python list to a CSV file clears the list将 Python 列表写入 CSV 文件会清除列表
【发布时间】:2018-03-19 10:40:55
【问题描述】:

我正在对列表、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 也会变成空的。

谢谢!

【问题讨论】:

  • 是否有任何答案对您有用。您可以接受有用的答案。

标签: python list csv enumerate


【解决方案1】:
c = enumerate(b)

这里的c 不是list 而是一个生成器,当你迭代它时会消耗它。

每次使用时都必须创建新的生成器。

如果您想要永久引用生成器的用尽内容,则必须将其转换为list

c = list(enumerate(b))

【讨论】:

    【解决方案2】:

    这是完全正常的。 c 是一个生成器,它将遍历 b 的所有元素,因此它只会遍历 b 一次。那是你打电话给writer.writerows(c).

    之后,生成器耗尽,因此使用它创建 list 将返回一个空列表。

    【讨论】:

    • c 被消耗不是因为它是迭代器,而是因为它是生成器。
    • @Rahul:是的,已修复
    【解决方案3】:

    [Python]: enumerate(iterable, start=0) 返回一个生成器

    来自[Python]: Generators

    使用生成器带来的性能改进是惰性(按需)生成值的结果,这意味着更低的内存使用量。此外,我们不需要等到所有元素都生成后才开始使用它们。这类似于迭代器提供的好处,但生成器使构建迭代器变得容易。
    ...
    注意:只有当我们不打算使用该组生成的值超过一次。

    生成器的值一旦被迭代就会被消耗掉。这就是为什么你必须通过例如“保存”它。将其转换为列表(这也会消耗它,因为它会迭代它)。

    有关更多详细信息,您还可以查看[SO]: How do I list all files of a directory? (@CristiFati's answer - Part One)初步说明部分 - 我在其中说明了[Python]: map(function, iterable, ...)的行为)。

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2016-09-02
      • 2016-03-26
      • 1970-01-01
      相关资源
      最近更新 更多