[英]Convert list of dicts to CSV in Python 3
我得到了一个不同长度甚至不同(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
文件。 如果key不在当前字典中,则设置默认值(例如' - ')。 示例中的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标题并按键填充值?
使用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
要克服该错误,您可以在写入文件之前收集所有密钥,如下所示:
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
为缺失的键指定默认值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.