使用多个密钥从CSV文件创建字典

时间:2014-07-30 14:46:57

标签: python csv dictionary

假设我有一个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 }

是否有方法可以帮助您做到这一点?

2 个答案:

答案 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'}