Python CSV DictReader忽略列?

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