将 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
如果我在写法之前执行:print(list(c))
,c
也变成空
谢谢!
c = enumerate(b)
这里c
不是list
而是一个生成器,当你迭代它时它会被消耗。
每次使用时都必须创建新的生成器。
如果你想永久引用生成器的耗尽内容,你必须将其转换为list
。
c = list(enumerate(b))
这很正常。 c
是一个生成器,它将遍历 b
的所有元素,因此它只会遍历 b
一次。那就是当你打电话给 writer.writerows(c).
之后,生成器被耗尽,因此从中创建一个 list
将 return 一个空列表。
[Python]: enumerate(iterable, start=0) returns 一个 发电机.
The performance improvement from the use of generators is the result of the lazy (on demand) generation of values, which translates to lower memory usage. Furthermore, we do not need to wait until all the elements have been generated before we start to use them. This is similar to the benefits provided by iterators, but the generator makes building iterators easy.
...
Note: a generator will provide performance benefits only if we do not intend to use that set of generated values more than once.
生成器的值在迭代后被消耗。这就是为什么你必须 "save" 它的原因,例如将它转换为一个列表(这也会消耗它,因为它会迭代它)。
更多详细信息,您还可以查看[SO]:如何列出目录中的所有文件?
(@CristiFati 的回答 - 第一部分)( 初步说明 部分 - 我在其中说明了 [Python]: map(function, iterable, ...) 的行为)。
我正在对列表、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
如果我在写法之前执行:print(list(c))
,c
也变成空
谢谢!
c = enumerate(b)
这里c
不是list
而是一个生成器,当你迭代它时它会被消耗。
每次使用时都必须创建新的生成器。
如果你想永久引用生成器的耗尽内容,你必须将其转换为list
。
c = list(enumerate(b))
这很正常。 c
是一个生成器,它将遍历 b
的所有元素,因此它只会遍历 b
一次。那就是当你打电话给 writer.writerows(c).
之后,生成器被耗尽,因此从中创建一个 list
将 return 一个空列表。
[Python]: enumerate(iterable, start=0) returns 一个 发电机.
The performance improvement from the use of generators is the result of the lazy (on demand) generation of values, which translates to lower memory usage. Furthermore, we do not need to wait until all the elements have been generated before we start to use them. This is similar to the benefits provided by iterators, but the generator makes building iterators easy.
...
Note: a generator will provide performance benefits only if we do not intend to use that set of generated values more than once.
生成器的值在迭代后被消耗。这就是为什么你必须 "save" 它的原因,例如将它转换为一个列表(这也会消耗它,因为它会迭代它)。
更多详细信息,您还可以查看[SO]:如何列出目录中的所有文件? (@CristiFati 的回答 - 第一部分)( 初步说明 部分 - 我在其中说明了 [Python]: map(function, iterable, ...) 的行为)。