将字典写入CSV文件,每行一个'key: value

125 投票
8 回答
381844 浏览
提问于 2025-04-17 09:18

我有一个字典:

mydict = {key1: value_a, key2: value_b, key3: value_c}

我想把这些数据写入一个名为 dict.csv 的文件,格式是这样的:

key1: value_a
key2: value_b
key3: value_c

我写了:

import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()

但是现在我发现,所有的键都在一行,所有的值在下一行……

当我成功写出这样的文件后,我还想把它读回来,放到一个新的字典里。

简单解释一下我的代码,这个字典里包含了一些来自文本框和复选框的值和布尔值(我用的是 wxpython)。我想添加“保存设置”和“加载设置”这两个按钮。

“保存设置”应该把字典按照我提到的方式写入文件(这样用户可以更方便地直接编辑这个 csv 文件),而“加载设置”则是从文件中读取数据,并更新文本框和复选框。

8 个回答

16

最简单的方法是不用csv这个模块,自己来格式化数据。

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
38

为了给大家提供一个选择,使用 pandas 这个库也可以把字典写入 csv 文件。根据给出的例子,可以这样做:

mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}

import pandas as pd

(pd.DataFrame.from_dict(data=mydict, orient='index')
   .to_csv('dict_file.csv', header=False))

最重要的是在 from_dict 方法中把 'orient' 参数设置为 'index'。这样你就可以选择是否想把每个字典的键写在新的一行。

另外,在 to_csv 方法中,把 header 参数设置为 False,这样输出的内容就只有字典的元素,而不会有多余的行。你也可以在 to_csv 方法中设置列名和索引名。

你的输出结果看起来会是这样的:

key1,a
key2,b
key3,c

如果你想让字典的键作为列名,只需使用默认的 'orient' 参数,也就是 'columns',具体可以查看文档链接。

根据 @Rabarberski 的评论,当使用 orient='columns 时,你需要这样配置数据:

d = {k: [v] for k, v in mydict.items()}

243

DictWriter 的工作方式可能和你想的不太一样。

with open('dict.csv', 'w') as csv_file:  
    writer = csv.writer(csv_file)
    for key, value in mydict.items():
       writer.writerow([key, value])

要把它读回来:

with open('dict.csv') as csv_file:
    reader = csv.reader(csv_file)
    mydict = dict(reader)

这种方式很简洁,但它假设你在读取的时候不需要进行任何类型转换。

撰写回答