我正在尝试编写一个脚本,该脚本采用项目为列表的字典,并将这些列表写入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
答案 0 :(得分:0)
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
答案 1 :(得分:0)
这可能无法直接解决您的问题,但如果您有一个类似
的列表 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
开始,您始终可以将字符串转换回原始格式。
答案 2 :(得分:0)
此外,您只需打开列表包装即可
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
当然,它不是分组的,但是如果数据格式严格,则很容易将其解析回去。