Python CSV DictReader 忽略列?

4 投票
4 回答
8398 浏览
提问于 2025-04-17 04:55

如果我使用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'}

撰写回答