首页 > 解决方案 > 使用复合键从字典中写入 csv 文件

问题描述

我有一本字典,其键是 2 个项目的元组。我想把这本字典写成一个.csv文件。

我的字典counter看起来像这样:

{("Banana", "Apple") : 1,
 ("Apple", "Pear") : 2,
 # ...
}

我试过这个:

header = ['group', 'list', 'id']
with open("file.csv", 'w') as f2:
    writer = csv.DictWriter(f2, fieldnames=header)
    writer.writeheader()
    for key, val in counter.items(): 
        write.writerow([key]+val)

但我得到这个错误:

TypeError: can only concatenate list (not "int") to list

有人可以帮助我吗?

编辑

我也试过这个:

with open("file.csv", 'w+') as f2:
    writer = csv.DictWriter(f2, fieldnames=header)
    writer.writeheader()
    for key, val in counter.items():
        writer.writerow(key,val)

但它现在说:

TypeError: writerow() takes 2 positional arguments but 3 were given

标签: pythoncsvdictionary

解决方案


counter您添加的字典内容示例中,我现在了解您要做什么。

以下是如何完成你想要的:

import csv

counter = {("Banana", "Apple"): 1,
           ("Apple", "Pear"): 2,
           # ...
          }

header = 'group', 'list', 'id'
with open("compound_keys.csv", 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=header)
    writer.writeheader()
    for (group, list_), id in counter.items():
        writer.writerow(dict(zip(header, (group, list_, id))))

.csv创建的文件内容:

group,list,id
Banana,Apple,1
Apple,Pear,2

笔记

在这种情况下,使用 acsv.writer而不是 a会更简单、更有效,csv.DictWriter因为这样就不需要创建一个临时字典来写入输出文件的每一行(只有一个元组)。

以下产生完全相同的结果:

header = 'group', 'list', 'id'
with open("compound_keys.csv", 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(header)
    for (group, list_), id in counter.items():
        writer.writerow((group, list_, id))

推荐阅读