在 Python 3 中将字典列表转换为 CSV

Kon*_*nov 7 python csv dictionary list python-3.x

我得到了不同长度甚至不同(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'},
]
Run Code Online (Sandbox Code Playgroud)

我需要创建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)
Run Code Online (Sandbox Code Playgroud)

错误:

ValueError: dict contains fields not in fieldnames: 'key2'
Run Code Online (Sandbox Code Playgroud)

如何将所有唯一键添加为 CSV 的标题并按键填充它的值?

Rao*_*zur 8

使用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)
Run Code Online (Sandbox Code Playgroud)

输出:

$ cat test.csv 
key3@key1@key2@anotherKey@anotherKey1
value3@value1@-@-@-
value3@someValue@value2@-@-
-@value1@value2@anotherValue@-
value3@value1@value2@anotherValue@anotherValue1
Run Code Online (Sandbox Code Playgroud)

参考:https : //docs.python.org/2/library/csv.html#csv.DictWriter