Конвертировать список dicts в CSV в Python 3 - PullRequest
0 голосов
/ 07 ноября 2018

Я получил список словарей разной длины и даже разных пар (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 из примера должен выглядеть следующим образом:

enter image description here

Я пытаюсь этот код для моего списка словарей, но он возвращает ошибку:

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 и заполнить их значения ключом?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Использовать 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

0 голосов
/ 07 ноября 2018

Чтобы устранить ошибку, вы можете собрать все ключи перед записью файла, например:

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, чтобы назначить значения по умолчанию для отсутствующих клавиш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...