Используя DictWriter для записи подмножества ключей словаря

Я записал функцию, которая сериализирует список словарей как файл CSV с помощью csv модуль, с кодом как это:

data = csv.DictWriter(out_f, fieldnames)
data.writerows(dictrows)

Однако я иногда хочу выписать в файл только подмножество ключей каждого словаря. Если я передаю как fieldnames подмножество ключей, которые имеет каждый словарь, я получаю ошибку:

"dict contains fields not in fieldnames"

Как я могу сделать его так, чтобы DictRows записал просто подмножество полей, которые я указываю к CSV, игнорируя те поля, которые находятся в словаре, но не в именах полей?

12
задан Mark Amery 7 January 2018 в 21:48
поделиться

2 ответа

Самый простой и прямой подход - передать extrasaction = 'ignore' при инициализации экземпляра DictWriter , как описано здесь :

Если словарь передан в writerow () метод содержит ключ, не можно найти в именах полей, необязательный параметр extrasaction указывает, что действие, которое нужно предпринять. Если он установлен на 'поднять' возникает ошибка ValueError . Если оно установлен на 'игнорировать' , дополнительные значения в словарь игнорируется.

Он также работает с writerows , который внутри компании просто многократно вызывает writerow .

39
ответ дан 2 December 2019 в 03:43
поделиться

Изменения в вашем коде:

Забудьте про Dictwriter, используйте обычный writer.

Затем пройдитесь по списку dicts:

for d in dictrows:
    ordinary_writer.writerow([d[fieldname] for fieldname in fieldnames])

Используйте d.get(fieldname, "") вместо d[fieldname], если не хотите получить исключение, если в d нет записи для fieldname.

Примечание для анонимных даунвоттеров: Это делает то, что решение Алекса делает под капотом (см. Lib/csv.py) и делает это немного лучше ... csv.py вызывает функцию для получения каждой строки в списке, и суть этой функции

return [rowdict.get(key, self.restval) for key in self.fieldnames]
1
ответ дан 2 December 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: