Python CSV DictReader 忽略列?
如果我使用CSV的dictReader来读取一个CSV文件,我该怎么做才能让它忽略CSV中的某些列呢?
举个例子,
"id","name","address","number","created"
"123456","someName","someAddress","someNumber","2003-5-0294"
我只想用这个读取器获取id和name,其他的列都不想要。我试过使用fieldnames,但它还是把其他列读进来了,并把它们设置为“None”。我注意到csv.DictWriter有一个'ignore'功能,但DictReader似乎没有。我希望能有一种更优雅的方法来做到这一点,而不是先读取所有数据,然后再把我想要的列写入另一个CSV文件,然后再用DictReader读取那个CSV进行进一步处理。
谢谢大家!
4 个回答
5
其他人提供的解决方案是从由DictReader返回的完整字典中,构建出更小的新字典。
这样做是必要的,因为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))
你可以看到,每个字段名都会被直接放入字典中,没有经过筛选。
顺便说一下,自己制作一个符合你需求的DictReader其实并不难。可以参考现有的CSV源代码来进行设计。
6
逐行读取数据,然后创建一个只包含你想要的键的字典列表。
[{'id':r['id'], 'name':r['name']} for r in mydictreader]
5
这个简单的生成器可以做到这一点。
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'}