繁体   English   中英

Python CSV DictReader忽略列?

[英]Python CSV DictReader ignore columns?

如果我使用CSV.dictReader读取CSV,我将如何忽略CSV中的某些列?

例如,

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

我想用读者来获取id和名字,丢弃并忽略其余部分。 我尝试使用字段名,但仍然将其读入并将其设置为“无”。 我注意到csv.DictWriter有一个'ignore'函数,但似乎DictReader没有。 希望有一种更优雅的方式来做到这一点,而不仅仅是阅读,然后只将我想要的列写入另一个CSV,然后使用DictReader读取该CSV进行进一步处理。

多谢你们!

读入每一行,然后只用你想要的键创建一个dicts列表。

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

这个简单的发电机就可以做到。

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'}

其他发布的解决方案从DictReader返回的较大的完全填充的dicts中构建了新的较小的dicts

这样的事情是必要的,因为DictReader API是故意设计的,不会跳过字段。 以下是来源摘录:

    # 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))

您可以看到每个fieldname都被分配给字典而不进行过滤。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM