Используя 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'
aValueError
поднимается. Если это имеет значение'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]