0

我正在使用一个巨大的 csv,我正在使用 csv.DictReader 进行解析,什么是根据键名修剪结果字典中数据的最有效方法。说,只保留包含 "JAN" 的键。

谢谢 !

4

3 回答 3

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

现在,尝试将其应用于您的问题......我只是猜测您正在根据“来自结果字典”这一短语构建字典字典。很明显,读取/对象将为每个输入记录返回一个字典。因此,文件的每一行都会有一个结果字典(假设任何常见的 CSV“方言”)。

当然,如果条件成立,我可以使用if i['uid'] > 1或仅添加到我的“守门员”中。if "Jan" in i['gecos']我这样写是为了强调如何轻松跳过那些您不感兴趣的值,以便您的for套件的其余部分可以对那些感兴趣的记录做各种有趣的事情。

但是,这个答案太简单了,我不得不怀疑我没有理解这个问题。(我使用 ''/etc/passwd'' 和一个冒号分隔的列表只是因为它是一种众所周知的格式,并且在 Linux、Unix 和 MacOS X 系统上都可以轻松获得世界可读的副本)。

于 2012-05-02T08:37:22.620 回答
0
result = {key:val for key, val in row.items() if 'JAN' in key}

从哪里row获得字典DictReader

于 2012-05-02T08:14:43.733 回答
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'}]
于 2012-05-02T08:14:54.930 回答