在csv.DictReader中剔除值

时间:2012-05-02 08:01:56

标签: python csv

我正在处理一个巨大的csv,我正在使用csv.DictReader进行解析,这将是根据键名修剪结果字典中数据的最有效方法。 比如说,只需保留包含“JAN”的键。

谢谢!

3 个答案:

答案 0 :(得分:0)

result = {key:val for key, val in row.items() if 'JAN' in key}

其中row是从DictReader获得的字典。

答案 1 :(得分:0)

你可以这样做:

>>> with open('file.csv') as f:
...   culled = [{k: d[k] for k in d if "JAN" in k} for d in csv.DictReader(f)]

当我在包含以下内容的简单CSV文件上尝试此操作时:

JAN11,FEB11,MAR11,APR11,MAY11,JUN11,JUL11,AUG11,SEP11,OCT11,NOV11,DEC11,JAN12,FEB12,MAR12,APR12
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32

我得到了以下结果:

>>> with open('file.csv') as f:
...   culled = [{k: d[k] for k in d if "JAN" in k} for d in csv.DictReader(f)]
... 
>>> culled
[{'JAN11': '1', 'JAN12': '13'}, {'JAN11': '17', 'JAN12': '29'}]

答案 2 :(得分:0)

好的,这是使用csv.DictReader和/etc/passwd

的一个愚蠢的例子
#!python
keepers = dict()
r = csv.DictReader(open('/etc/passwd', 'r'), delimiter=":", \
      fieldnames=('login','pw', 'uid','gid','gecos','homedir', 'shell'))
for i in r:
    if i['uid'] < 1:
        continue
    keepers[i['login']]=i

现在,尝试将其应用于您的问题......我只是猜测您正在根据短语&#34;从结果字典中构建字典词典。&#34;很明显,read / object将为每个输入记录返回一个字典。因此,对于文件的每一行都会有一个结果字典(假设任何常见的CSV&#34;方言&#34;)。

当然,我本来可以使用if i['uid'] > 1if "Jan" in i['gecos'],而只是添加到我的&#34;饲养员&#34;如果条件成立。我这样写是为了强调你如何轻松跳过那些你不感兴趣的值,这样你的for套件的其余部分就可以对那些感兴趣的记录做各种有趣的事情。 / p>

但是,这个答案很简单,我不得不怀疑我不理解这个问题。 (我使用&#39;&#39; / etc / passwd&#39;&#39;和冒号分隔列表只是因为它是一种非常着名的格式和世界可读的副本很容易可在Linux,Unix和MacOS X系统上使用。)