将多个字典写入csv文件?

4 投票
4 回答
13694 浏览
提问于 2025-04-17 21:27

感谢这个其他的讨论串,我作为初学者成功地用Python把我的字典写入了一个csv文件:将字典写入csv文件,每个'键: 值'一行

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

csv文件看起来是这样的:

0  24.7548
1  34.2422
2  19.3290

现在,我在想,如何组织几个有相同键的字典会比较好。我想把这些键放在第一列,然后把字典的值放在后面的列,第一行用来标识每个字典的名字。

当然,有很多讨论串在尝试做类似的事情,比如:将字典写入csv,键作为表头,值作为列时遇到的问题,但我的数据结构还不是那样(还没做到…)。也许这些字典需要先合并。

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 个回答

-2

我很久没用Python了,不过我有个建议。
在Python中,字典里的值可以是任何类型(我记得是这样,如果错了别喷我)。至少你可以把键对应到列表上。

所以你可以遍历你的字典,可能创建一个新的字典'd',然后对于每个键,如果这个键的值已经在'd'里,就把这个值添加到'd'对应的值里(因为这个值是一个列表)。

然后你可以把新的字典写出来,像这样:(伪代码)
对于字典中的每个键和值
   写出键
   写一个制表符(TAB)
   对于值中的每个v
      写出v + 制表符(TAB)
   写一个换行
结束循环

不过这段代码没有包括“表头名称”,但我相信加上去应该很简单。

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)
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文件中。这次可以用 csv 模块的 writerow 方法来帮助你。

4

使用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])

如果你需要处理一些情况,比如你不能确定所有字典都有相同的键,你需要做一些小的修改:

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])

撰写回答