在 Python 3 中将字典列表转换为 CSV
Posted
技术标签:
【中文标题】在 Python 3 中将字典列表转换为 CSV【英文标题】:Convert list of dicts to CSV in Python 3 【发布时间】:2019-04-11 00:13:44 【问题描述】:我得到了一个不同长度的字典列表,甚至不同的(key: values)
对。例如:
[
'key1': 'value1', 'key3':'value3',
'key1': 'someValue', 'key2':'value2', 'key3':'value3',
'anotherKey': 'anotherValue', 'key1': 'value1', 'key2':'value2',
'anotherKey': 'anotherValue', 'anotherKey1': 'anotherValue1', 'key1': 'value1', 'key2':'value2', 'key3':'value3',
]
我需要创建CSV
文件,其中所有键都作为标题和值。如果键不在当前字典中,则设置默认值(例如'-')。示例中的CSV
应该是这样的:
我正在为我的字典列表尝试此代码,但它返回错误:
listOfDicts = [
'key1': 'value1', 'key3':'value3',
'key1': 'someValue', 'key2':'value2', 'key3':'value3',
'anotherKey': 'anotherValue', 'key1': 'value1', 'key2':'value2',
'anotherKey': 'anotherValue', 'anotherKey1': 'anotherValue1', 'key1': 'value1', 'key2':'value2', 'key3':'value3',
]
keys = listOfDicts[0].keys()
with open('test.csv', 'a') as output_file:
dict_writer = csv.DictWriter(output_file, fieldnames=keys, delimiter='@')
dict_writer.writeheader()
dict_writer.writerows(listOfDicts)
错误:
ValueError: dict contains fields not in fieldnames: 'key2'
如何将所有唯一键添加为 CSV 的标题并按键填充值?
【问题讨论】:
您可以使用pandas.from_dict()
方法,循环添加每一行并使用df.to.csv(path_to_csv)
保存
【参考方案1】:
使用DicitWritter()
restval
参数,
可选的restval参数指定要写入的值,如果 字典缺少字段名中的键。
对于fieldnames
参数,使用字典列表中所有可用键的列表。
import csv
listOfDicts = [
'key1': 'value1', 'key3':'value3',
'key1': 'someValue', 'key2':'value2', 'key3':'value3',
'anotherKey': 'anotherValue', 'key1': 'value1', 'key2':'value2',
'anotherKey': 'anotherValue', 'anotherKey1': 'anotherValue1', 'key1': 'value1', 'key2':'value2', 'key3':'value3',
]
keys = [i for s in [d.keys() for d in listOfDicts] for i in s]
with open('test.csv', 'a') as output_file:
dict_writer = csv.DictWriter(output_file, restval="-", fieldnames=keys, delimiter='@')
dict_writer.writeheader()
dict_writer.writerows(listOfDicts)
输出:
$ cat test.csv
key3@key1@key2@anotherKey@anotherKey1
value3@value1@-@-@-
value3@someValue@value2@-@-
-@value1@value2@anotherValue@-
value3@value1@value2@anotherValue@anotherValue1
参考:https://docs.python.org/2/library/csv.html#csv.DictWriter
【讨论】:
@KonstantinRusanov 不小心我在编辑帖子时删除了重要的代码行。抱歉 :) 请立即尝试。【参考方案2】:为了克服这个错误,您可以在写入文件之前收集所有密钥,如下所示:
keys = set()
for d in listOfDicts:
keys.update(d.keys())
with open('test.csv', 'a') as output_file:
dict_writer = csv.DictWriter(
output_file, fieldnames=keys, restval='-', delimiter='@')
dict_writer.writeheader()
dict_writer.writerows(listOfDicts)
您可以使用参数DictWriter.restval
为缺少的键分配默认值。
【讨论】:
keys
集合结构在这里非常清楚,并且工作正常,不像已接受答案中的单行,它在非常大且稀疏的字典列表中对我不起作用......不知道为什么。以上是关于在 Python 3 中将字典列表转换为 CSV的主要内容,如果未能解决你的问题,请参考以下文章