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

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

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

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

"dict contains fields not in fieldnames"

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

2 ответов


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

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

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


изменения в коде:

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

затем цикл над списком диктов:

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

использовать d.get(fieldname, "") вместо d[fieldname] Если вы не хотите, исключение, если нет записи в d на fieldname.

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

return [rowdict.get(key, self.restval) for key in self.fieldnames]