将多个字典写入CSV文件?

4

感谢这个帖子的帮助,我作为一个Python初学者已经成功地将我的字典写入了CSV文件:

将字典写入CSV文件,每行都是“键:值”
dict1 = {0 : 24.7548, 1: 34.2422, 2: 19.3290}

CSV看起来像这样:

0  24.7548
1  34.2422
2  19.3290

现在,我正在考虑如何最好地组织具有相同键的几个字典。我希望将键作为第一列,然后是字典值在其后的列,所有这些都有一个第一行来通过字典名称区分列。
当然,有很多线程试图做类似的事情,例如: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个回答

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

如果每个dict中都不存在key,则理解将失败。这可能对发布者来说不是问题,但需要注意。您可以使用defaultdict或自定义类覆盖__missing__而不是使用dict,但是尝试为dicts中的每个d访问d[key]可能会引发KeyError - ely
那要看情况。如果预期所有字典都包含所有键,则默认字典不是正确的选择。 - Steinar Lima
如果您需要处理可能缺失的条目,请使用d.get(key, None) - Steinar Lima
这是一种处理它们的方式,如果你只想交换一个哨兵值。__missing__让你可以做更多的事情。 - ely

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方法来帮助实现。


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)

-2

我已经有一段时间没有使用Python了,但这是我的建议。

在Python中,字典的值可以是任何类型(据我所记,如果我错了,请不要责备我)。至少应该可以将键映射到列表。

因此,您可以循环遍历您的字典,也许创建一个新的字典'd',对于每个键,如果值已经在'd'中,则将该值推送到'd'的值中(因为相关键的值是一个列表)。

然后,您可以将新字典写出来:(伪代码) 对于每个键,值在字典中 写入键 写入TAB 对于值中的每个v 写入v + TAB 写入新行 结束for

这并不包括“标题名称”,但我相信这很容易添加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接