繁体   English   中英

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

[英]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将一个序列作为输入( 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

这可能无法直接解决您的问题,但是如果您有类似

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM