Python CSV DictReader игнорирует столбцы?

Если я использую CSV.dictReader для чтения в CSV, как бы я хотел, чтобы он игнорировал некоторые столбцы в CSV?

Например,

"id","name","address","number","created" "123456","someName","someAddress","someNumber","2003-5-0294" 

И я хочу просто получить идентификатор и имя, используя читателя, отбрасывая и игнорируя остальных. Я пробовал использовать имена полей, но он все еще читает его и устанавливает его как «Нет». Я заметил, что у csv.DictWriter есть функция «игнорировать», но, похоже, DictReader этого не делает. Был надеяться, что существует более элегантный способ сделать это, а не просто читать, а затем писать только столбцы, которые я хочу использовать для другого CSV, а затем читать этот CSV с помощью DictReader для дальнейшей обработки.

Спасибо, парни!

Этот простой генератор сделает это.

 def dict_filter(it, *keys): for d in it: yield dict((k, d[k]) for k in keys) 

Используйте его так:

 dreader = [{'id':1, 'name':'Bob', 'other_stuff':'xy'}, {'id':2, 'name':'Jen', 'other_stuff':'xx'}] for d in dict_filter(dreader, 'id', 'name'): print d 

дает:

 {'id': 1, 'name': 'Bob'} {'id': 2, 'name': 'Jen'} 

Читайте в каждой строке, затем создайте список dicts с помощью только тех ключей, которые вы хотите.

 [{'id':r['id'], 'name':r['name']} for r in mydictreader] 

Другие размещенные решения создают новые меньшие дикты из более крупных заполненных диктов, возвращаемых DictReader .

Что-то вроде этого будет необходимо, потому что API DictReader был намеренно разработан, чтобы не пропускать поля. Вот выдержка из источника:

  # unlike the basic reader, we prefer not to return blanks, # because we will typically wind up with a dict full of None # values while row == []: row = self.reader.next() d = dict(zip(self.fieldnames, row)) 

Вы можете видеть, что каждое имя поля присваивается словарю без фильтрации.

FWIW, это не сложно сделать ваш собственный вариант DictReader желаемым поведением. Моделируйте его после существующего источника CSV .

 from operator import itemgetter cols=('name', 'id') #Tuple of keys you want to keep valuesfor=itemgetter(*cols) for d in dictreader_input: print dict(zip(cols, valuesfor(d))) # dict from zipping cols and values