Использование DictWriter для записи подмножества ключей словаря - PullRequest
11 голосов
/ 09 июля 2010

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

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

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

"dict contains fields not in fieldnames"

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

Ответы [ 2 ]

37 голосов
/ 09 июля 2010

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

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

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

1 голос
/ 09 июля 2010

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

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

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

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...