[英]csv.writerows writes lists as strings in the output CSV file
我正在尝试编写一个脚本,该脚本采用一个字典,该字典的项为列表,并将这些列表写入CSV文件。 我的代码如下:
import csv
data = {'a': [1, 2, 3, 4], 'b': [5,6,7,8]}
shape = {'a': ['round', 'square'], 'b': ['triangle', 'oval']}
size = {'a': [100, 1000], 'b': [750, 750]}
with open('test.csv', 'w+') as f_raw:
writer = csv.writer(f_raw, delimiter=',', lineterminator='\n')
for id in data.keys():
line = [id, data[id], shape[id], size[id]]
writer.writerow(line)
输出CSV文件的格式为
a,"[1, 2, 3, 4]","['round', 'square']","[100, 1000]"
b,"[5, 6, 7, 8]","['triangle', 'oval']","[750, 750]"
所有列表都用引号引起来,使它们成为字符串。 我希望它们保留为列表,因此当我阅读它们时,python会将它们检测为列表,而不是字符串。 我缺少什么导致了此问题?
我正在使用python 3.6
csv
模块writerow
将一个序列作为输入( list
或tuple
都可以)。 对于每个项目,它将它们转换为它们的字符串表示形式,这对于整数和浮点数(以及字符串)是很好的选择。
但是对于列表,这不是您所期望的。
解决方案:只需将列表加在一起即可创建行:
with open('test.csv', 'w',newline="") as f_raw:
writer = csv.writer(f_raw, delimiter=',', lineterminator='\n')
for id in data.keys():
line = [id] + data[id] + shape[id] + size[id]
writer.writerow(line)
与您的数据一起,该文件现在包含:
b,5,6,7,8,triangle,oval,750,750
a,1,2,3,4,round,square,100,1000
这可能无法直接解决您的问题,但是如果您有类似
a = ["[1, 2, 3, 4]","['round', 'square']","[100, 1000]"]
那么下面的内容肯定会很方便:
from ast import literal_eval
>>> a = ["[1, 2, 3, 4]","['round', 'square']","[100, 1000]"]
>>> list(map(literal_eval, a))
[[1, 2, 3, 4], ['round', 'square'], [100, 1000]]
从literal_eval
您始终可以将字符串转换回其原始形式。
另外,您只需打开列表的包装即可:
for id in data.keys():
line = [id, *data[id], *shape[id], *size[id]]
writer.writerow(line)
结果:
a,1,2,3,4,round,square,100,1000
b,5,6,7,8,triangle,oval,750,750
当然,它不是分组的,但是如果您对数据进行了严格格式化,则很容易将其解析回去。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.