我正在使用一个巨大的 csv,我正在使用 csv.DictReader 进行解析,什么是根据键名修剪结果字典中数据的最有效方法。说,只保留包含 "JAN" 的键。
谢谢 !
好的,这是一个使用 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 系统上都可以轻松获得世界可读的副本)。
result = {key:val for key, val in row.items() if 'JAN' in key}
从哪里row
获得字典DictReader
。
你可以这样做:
>>> 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'}]