将字典写入CSV文件,每行一个'key: value
我有一个字典:
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 个回答
最简单的方法是不用csv这个模块,自己来格式化数据。
with open('my_file.csv', 'w') as f:
[f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]
为了给大家提供一个选择,使用 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()}
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)
这种方式很简洁,但它假设你在读取的时候不需要进行任何类型转换。