将多个词典写入csv文件?

时间:2014-03-08 19:29:11

标签: python csv dictionary

感谢这个其他线程,我已成功使用Python将我的字典编写为csv作为初学者: Writing a dictionary to a csv file with one line for every 'key: value'

dict1 = {0 : 24.7548, 1: 34.2422, 2: 19.3290}

csv看起来像这样:

0  24.7548
1  34.2422
2  19.3290

现在,我想知道用相同的键组织几个词典的最佳方法是什么。我希望将键作为第一列,然后是列之后的dict值,所有第一行都用字典名来区分列。

当然,有很多线程试图做类似的事情,例如:Trouble writing a dictionary to csv with keys as headers and values as columns,但没有以相同的方式构建我的数据(但......)。也许字典必须先合并。

dict2 = {0 : 13.422, 1 : 9.2308, 2 : 20.132}
dict3 = {0 : 32.2422, 1 : 23.342, 2 : 32.424}

我理想的输出:

ID  dict1    dict2    dict3
0   24.7548  13.422   32.2422
1   34.2422  9.2308   23.342
2   19.3290  20.132   32.424

我不确定键名的列名ID如何在那里发挥作用。

4 个答案:

答案 0 :(得分:3)

使用csv模块和列表推导:

import csv

dict1 = {0: 33.422, 1: 39.2308, 2: 30.132}
dict2 = {0: 42.2422, 1: 43.342, 2: 42.424}
dict3 = {0: 13.422, 1: 9.2308, 2: 20.132}
dict4 = {0: 32.2422, 1: 23.342, 2: 32.424}

dicts = dict1, dict2, dict3, dict4

with open('my_data.csv', 'wb') as ofile:
    writer = csv.writer(ofile, delimiter='\t')
    writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4'])
    for key in dict1.iterkeys():
        writer.writerow([key] + [d[key] for d in dicts])

请注意,默认情况下字典是无序的,因此如果您希望按升序排列键,则必须对键进行排序:

for key in sorted(dict1.iterkeys(), key=lambda x: int(x)):
    writer.writerow([key] + [d[key] for d in dicts])

如果您需要处理无法确定所有dicts具有相同键的情况,您需要更改一些小东西:

with open('my_data.csv', 'wb') as ofile:
    writer = csv.writer(ofile, delimiter='\t')
    writer.writerow(['ID', 'dict1', 'dict2', 'dict3', 'dict4'])
    keys = set(d.keys() for d in dicts)
    for key in keys:
        writer.writerow([key] + [d.get(key, None) for d in dicts])

答案 1 :(得分:1)

使用defaultdict(list)

from collections import defaultdict
merged_dict = defaultdict(list)
dict_list = [dict1, dict2, dict3]

for dict in dict_list:
    for k, v in dict.items():
        merged_dict[k].append(v)

这就是你得到的:

{0: [24.7548, 13.422, 32.2422], 1: [34.2422, 9.2308, 23.342], 2: [19.329, 20.132, 32.424]})

然后将merged_dict写入csv文件,就像之前为单个dict所做的那样。这次writerow模块的csv方法很有帮助。

答案 2 :(得分:1)

这是一种方法。

my_dicts = [dict1, dict2, dict3]
dict_names = range(1, len(my_dicts)+1)
header = "ID," + ",".join(map(lambda x: "dict"+str(x)), dict_names) + "\n"
all_possible_keys = set(reduce(lambda x,y: x + y.keys(), my_dicts, []))

with open("file_to_write.csv", "w") as output_file:
    output_file.write(header)
    for k in all_possible_keys:
        print_str = "{},".format(k)
        for d in my_dicts:
            print_str += "{},".format(d.get(k, None))
        print_str += "\n"
        output_file.write(print_str)

答案 3 :(得分:-1)

我使用Python已经有一段时间了,但这是我的建议。 在Python中,字典值可以是任何类型(据我记得,如果我错了,不要激怒我)。至少应该可以将你的键映射到列表。

所以你可以循环你的词典,也许可以创建一个新词典'd',对于每个键,如果值已经在'd',则将值推到'd'的值(因为值为关联的密钥是一个列表。)

然后你可以把新词典写成:(伪代码) 对于每个键,字典中的值     写密钥     写TAB     对于每个v的值         写v + TAB     写新线

结束

虽然这不包括'标题名称',但我确信这很容易添加。