从csv文件创建字典?

时间:2011-07-19 00:09:27

标签: python csv dictionary list-comprehension

我正在尝试从csv文件创建字典。 csv文件的第一列包含唯一键,第二列包含值。 csv文件的每一行代表字典中唯一的键值对。我尝试使用csv.DictReadercsv.DictWriter类,但我只能弄清楚如何为每一行生成一个新的字典。我想要一本字典。这是我试图使用的代码:

import csv

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
    writer = csv.writer(outfile)
    for rows in reader:
        k = rows[0]
        v = rows[1]
        mydict = {k:v for k, v in rows}
    print(mydict)

当我运行上面的代码时,我得到一个ValueError: too many values to unpack (expected 2)。如何从csv文件创建一个字典?感谢。

16 个答案:

答案 0 :(得分:124)

我相信您正在寻找的语法如下:

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = {rows[0]:rows[1] for rows in reader}

或者,对于python< = 2.7.1,您需要:

mydict = dict((rows[0],rows[1]) for rows in reader)

答案 1 :(得分:54)

通过打开然后csv.DictReader打开文件。

input_file = csv.DictReader(open("coors.csv"))

您可以通过迭代input_file来遍历csv文件dict reader对象的行。

for row in input_file:
    print row

OR     仅访问第一行

dictobj = csv.DictReader(open('coors.csv')).next() 

答案 2 :(得分:50)

import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v

答案 3 :(得分:15)

你必须将csv.reader转换为dict:

~ >> cat > 1.csv
key1, value1
key2, value2
key2, value22
key3, value3

~ >> cat > d.py
import csv
with open('1.csv') as f:
    d = dict(filter(None, csv.reader(f)))

print(d)

~ >> python d.py
{'key3': ' value3', 'key2': ' value22', 'key1': ' value1'}

答案 4 :(得分:15)

这不是优雅,而是使用熊猫的单行解决方案。

import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()

如果要为索引指定dtype(如果由于bug而使用index_col参数,则无法在read_csv中指定):

import pandas as pd
pd.read_csv('coors.csv', header=None, dtype={0: str}).set_index(0).squeeze().to_dict()

答案 5 :(得分:11)

你也可以使用numpy。

from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }

答案 6 :(得分:4)

如果文件末尾有空行,我建议添加if rows

import csv
with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = dict(row[:2] for row in reader if row)

答案 7 :(得分:3)

如果您对使用numpy软件包没问题,那么您可以执行以下操作:

import numpy as np

lines = np.genfromtxt("coors.csv", delimiter=",", dtype=None)
my_dict = dict()
for i in range(len(lines)):
   my_dict[lines[i][0]] = lines[i][1]

答案 8 :(得分:2)

假设您具有以下结构的CSV:

"a","b"
1,2
3,4
5,6

您希望输出为:

[{'a': '1', ' "b"': '2'}, {'a': '3', ' "b"': '4'}, {'a': '5', ' "b"': '6'}]

一个zip功能(尚未提及)非常简单并且很有帮助。

def read_csv(filename):
    with open(filename) as f:
        file_data=csv.reader(f)
        headers=next(file_data)
        return [dict(zip(headers,i)) for i in file_data]

答案 9 :(得分:1)

你可以使用它,这很酷:

import dataconverters.commas as commas
filename = 'test.csv'
with open(filename) as f:
      records, metadata = commas.parse(f)
      for row in records:
            print 'this is row in dictionary:'+rowenter code here

答案 10 :(得分:1)

单线解决方案

import pandas as pd

dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}

答案 11 :(得分:0)

尝试使用defaultdictDictReader

import csv
from collections import defaultdict
my_dict = defaultdict(list)

with open('filename.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    for line in csv_reader:
        for key, value in line.items():
            my_dict[key].append(value)

它返回:

{'key1':[value_1, value_2, value_3], 'key2': [value_a, value_b, value_c], 'Key3':[value_x, Value_y, Value_z]}

答案 12 :(得分:0)

已经发布了许多解决方案,我想为我的做出贡献,该解决方案适用于CSV文件中不同数量的列。 它创建一个字典,每列一个键,每个键的值是一个列表,其中包含该列中的元素。

    input_file = csv.DictReader(open(path_to_csv_file))
    csv_dict = {elem: [] for elem in input_file.fieldnames}
    for row in input_file:
        for key in csv_dict.keys():
            csv_dict[key].append(row[key])

答案 13 :(得分:0)

对于简单的csv文件,例如以下

id,col1,col2,col3
row1,r1c1,r1c2,r1c3
row2,r2c1,r2c2,r2c3
row3,r3c1,r3c2,r3c3
row4,r4c1,r4c2,r4c3

您可以仅使用内置功能将其转换为Python字典

with open(csv_file) as f:
    csv_list = [[val.strip() for val in r.split(",")] for r in f.readlines()]

(_, *header), *data = csv_list
csv_dict = {}
for row in data:
    key, *values = row   
    csv_dict[key] = {key: value for key, value in zip(header, values)}

这将产生以下字典

{'row1': {'col1': 'r1c1', 'col2': 'r1c2', 'col3': 'r1c3'},
 'row2': {'col1': 'r2c1', 'col2': 'r2c2', 'col3': 'r2c3'},
 'row3': {'col1': 'r3c1', 'col2': 'r3c2', 'col3': 'r3c3'},
 'row4': {'col1': 'r4c1', 'col2': 'r4c2', 'col3': 'r4c3'}}

注意:Python词典具有唯一键,因此,如果csv文件具有重复的ids,则应将每行追加到列表中。

for row in data:
    key, *values = row

    if key not in csv_dict:
            csv_dict[key] = []

    csv_dict[key].append({key: value for key, value in zip(header, values)})

答案 14 :(得分:0)

例如,使用熊猫要容易得多。 假设您拥有以下数据作为CSV并将其命名为test.txt / test.csv(您知道CSV是一种文本文件)

a,b,c,d
1,2,3,4
5,6,7,8

现在正在使用熊猫

import pandas as pd
df = pd.read_csv("./text.txt")
df_to_doct = df.to_dict()

每行应该是

df.to_dict(orient='records')

就是这样。

答案 15 :(得分:0)

如果有:

  1. 仅1个键和1个值作为键,csv中的值
  2. 不想导入其他软件包
  3. 想一次创建一个字典

执行此操作:

mydict = {y[0]: y[1] for y in [x.split(",") for x in open('file.csv').read().split('\n') if x]}

它有什么作用?

它使用列表理解来拆分行,最后一个“ if x”用于忽略空行(通常在末尾),然后使用字典理解将其解压缩为字典。