Я записал функцию, которая сериализирует список словарей как файл CSV с помощью csv
модуль, с кодом как это:
data = csv.DictWriter(out_f, fieldnames)
data.writerows(dictrows)
Однако я иногда хочу выписать в файл только подмножество ключей каждого словаря. Если я передаю как fieldnames
подмножество ключей, которые имеет каждый словарь, я получаю ошибку:
"dict contains fields not in fieldnames"
Как я могу сделать его так, чтобы DictRows записал просто подмножество полей, которые я указываю к CSV, игнорируя те поля, которые находятся в словаре, но не в именах полей?
Самый простой и прямой подход - передать extrasaction = 'ignore'
при инициализации экземпляра DictWriter
, как описано здесь :
Если словарь передан в
writerow ()
метод содержит ключ, не можно найти в именах полей, необязательный параметр extrasaction указывает, что действие, которое нужно предпринять. Если он установлен на'поднять'
возникает ошибкаValueError
. Если оно установлен на'игнорировать'
, дополнительные значения в словарь игнорируется.
Он также работает с writerows
, который внутри компании просто многократно вызывает writerow
.
Изменения в вашем коде:
Забудьте про 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]