Python CSV DictReader ignore columns?
如果我使用csv.dictleader来读取csv,我该如何让它忽略csv中的某些列?
例如,
1 2 | "id","name","address","number","created" "123456","someName","someAddress","someNumber","2003-5-0294" |
我只想用读卡器获取ID和名称,丢弃并忽略其余部分。我尝试使用域名,但它仍然会读取并将其设置为"无"。我注意到csv.dictwriter有一个"忽略"功能,但似乎dictReader没有。希望有一种更优雅的方式来做这件事,而不是仅仅阅读然后只写我想写的专栏到另一个csv,然后用dictleader读取csv来做进一步的处理。
谢谢你们!
这个简单的发电机就可以了。
1 2 3 | def dict_filter(it, *keys): for d in it: yield dict((k, d[k]) for k in keys) |
号
这样使用:
1 2 3 4 5 | 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 |
给予:
1 2 | {'id': 1, 'name': 'Bob'} {'id': 2, 'name': 'Jen'} |
。
其他发布的解决方案从DictReader返回的较大的完全填充的dict构建新的较小的dict。
这是必要的,因为DictReader API是专门设计用来不跳过字段的。以下是摘自资料来源:
1 2 3 4 5 6 | # 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,这并不难让你自己变种的听写员会有所期望的行为。根据现有的csv源对其建模。
在每一行中阅读,然后用您想要的键创建一个听写列表。
1 | [{'id':r['id'], 'name':r['name']} for r in mydictreader] |
1 2 3 4 5 6 7 | 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 |