我有一个很大的列表,我是从.csv中提取的:
CSV_PATH = 'myfile.csv'
CSV_OBJ = csv.DictReader(open(CSV_PATH, 'r'))
CSV_LIST = list(CSV_OBJ)
我只想在其中保留一些列:
KEEP_COLS = ['Name', 'Year', 'Total Allocations', 'Enrollment']'
似乎Removing multiple keys from a dictionary safely似乎应该有效:
BETTER = {k: v for k, v in CSV_LIST if k not in KEEP_COLS}
但是我收到了一个错误:ValueError: too many values to unpack
我在这里错过了什么?我可以编写一个循环,通过CSV_LIST运行并通过保持我想要的东西产生更好,但我怀疑使用理解更加pythonic。
根据要求,提供一大块CSV_LIST
{'EIN': '77-0000091',
'FR': '28.4',
'Name': 'Org A',
'Enrollment': '506',
'Total Allocations': '$34214',
'geo_latitude': '37.9381775755',
'geo_longitude': '-122.3146910612',
'Year': '2009'},
{'EIN': '77-0000091',
'FR': '28.4',
'Name': 'Org A',
'Enrollment': '506',
'Total Allocations': '$34214',
'geo_latitude': '37.9381775755',
'geo_longitude': '-122.3146910612',
'Year': '2010'}
在命令行我可以做csvcut -c 'Name','Year','Total Allocations','Enrollment' myfile.csv > better_myfile.csv
,但这绝对不是pythonic。
答案 0 :(得分:2)
你的字典理解很好,但由于你有一个列表的词典,你必须使用字典理解为各个列表项创建一个列表理解。此外,由于您希望保留这些列,我猜您应该放弃not
。试试这个:
[{k: v for k, v in d.items() if k in KEEP_COLS} for d in CSV_LIST]
答案 1 :(得分:2)
另一种方法是使用
CSV_LIST = map(operator.itemgetter(*KEEP_LIST), CSV_OBJ)
这将创建一个包含所需列的元组列表。
答案 2 :(得分:1)
问题在于CSV_LIST
是列表,而不是单个dict
。 @tobias explained how to unpack it correctly.
但是,如果您担心自己是Pythonic,为什么要将DictReader
处理成字典列表然后过滤掉除了几个键以外的所有字典?在不知道您的用例的情况下我无法确定,但是按照预期的方式逐行使用DictReader
可能会更简洁,更简单:
with open(CSV_PATH, 'r') as f:
for row in csv.DictReader(f):
process(row['Name'],row['Year'],row['Total Allocations'],row['Enrollment'])