假设我有一个csv文件,并且想要一个每个值有多个键的字典。
示例csv:
col1,col2,col2,col4,col5
a1,b1,c1,d1,e1
a2,b2,c2,d2,e2
a3,b3,c3,d3,e3
您将如何创建字典,以便专门提取列1,2,3作为键并使用col5作为值。
输出:
{(a1,b1,c1):e1 , (a2,b2,c2):e2 , (a3,b3,c3):e3 }
是否有方法可以帮助您做到这一点?
答案 0 :(得分:5)
你可以使用词典理解:
import csv
with open(filename, 'rb') as infh:
reader = csv.reader(infh)
next(reader) # skip the header row
result = {tuple(row[:3]): row[4] for row in reader}
字典的键必须是不可变的; csv.reader()
生成列表,以便从我使用切片和tuple()
函数的前3列生成元组。
演示:
>>> import csv
>>> sample = '''\
... col1,col2,col2,col4,col5
... a1,b1,c1,d1,e1
... a2,b2,c2,d2,e2
... a3,b3,c3,d3,e3
... '''
>>> reader = csv.reader(sample.splitlines())
>>> next(reader)
['col1', 'col2', 'col2', 'col4', 'col5']
>>> {tuple(row[:3]): row[4] for row in reader}
{('a3', 'b3', 'c3'): 'e3', ('a2', 'b2', 'c2'): 'e2', ('a1', 'b1', 'c1'): 'e1'}
答案 1 :(得分:3)
您需要使用元组作为字典键。从csv module documentation改编,以下内容应该有效。
import csv
with open('eggs.csv') as csvfile:
spamreader = csv.reader(csvfile)
next(spamreader) # skip header
results = { (a, b, c): e for a, b, c, d, e in spamreader }
# or for python <= 2.6
# results = dict(((a, b, c), e) for a, b, c, d, e in spamreader)
print(results)
打印出来
{('a3', 'b3', 'c3'): 'e3', ('a2', 'b2', 'c2'): 'e2', ('a1', 'b1', 'c1'): 'e1'}