在 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的主要内容,如果未能解决你的问题,请参考以下文章

在python中将列表错误地转换为数据框[重复]

在python中将JSON字典转换为JSON数组

在python中将cidr转换为子网掩码

如何在ansible中将字典或列表转换为字符串

python怎么把列表转换成字符串?

在python中将列表转换为嵌套列表