csv.writerows将列表作为字符串写入输出CSV文件中

时间:2017-09-20 18:48:33

标签: python csv python-3.6

我正在尝试编写一个脚本,该脚本采用项目为列表的字典,并将这些列表写入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

3 个答案:

答案 0 :(得分:0)

csv模块writerow将序列作为输入(listtuple即可)。对于每个项目,它将它们转换为字符串表示形式,这对于整数和浮点数(和字符串)。

但对于名单,这不是你所期待的。

解决方案:只需将列表添加到一起即可创建行:

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

当然,它不是分组的,但是如果数据格式严格,则很容易将其解析回去。