从CSV文件创建字典?

229

我正在尝试从一个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文件中创建一个字典?谢谢。


3
你能否举一个输入文件和其对应的数据结构的例子? - robert
1
当您迭代csv.reader时,您会得到单行而不是多行。 因此,有效的形式是mydict = {k:v for k,v in reader} 但是,如果您确定csv文件中只有两列,则mydict = dict(reader)速度更快。 - Alex Laskin
请注意,将字典/键值数据存储在CSV文件中并非没有问题(例如处理混合类型列)。在我看来,JSON格式可以更好地表示这种类型的数据。 - mirekphd
18个回答

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]

我认为你应该更改 dtype=str,因为对于 None,会将字节作为键和值传入。 - mirekphd

3
使用pandas,例如,变得更加容易。 假设您拥有以下数据作为CSV文件,让我们称其为test.txt/test.csv(您知道CSV是一种文本文件)。
a,b,c,d
1,2,3,4
5,6,7,8

现在使用pandas

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

对于每一行,它将会是:

df.to_dict(orient='records')

就是这样了。


2
您可以使用这个,它非常酷:
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

2
许多解决方案已经发布,我想用我的方法做出贡献,这个方法适用于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])

你把字典搞错了,参见https://dev59.com/5Ww15IYBdhLWcg3wO5SX#57069644 - flywire

1
尝试使用 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]}

0

这里有一种将CSV转换为字典的方法:

import pandas

data = pandas.read_csv('coors.csv')

the_dictionary_name = {row.k: row.v for (index, row) in data.iterrows()}

0

如果您有以下情况:

  1. 在您的 CSV 中,只有 1 个键和 1 个值作为键值对
  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”用于忽略空行(通常在末尾),然后使用字典推导式将其解包成字典。


0
可能不是最高效的方法,但这是我首选的方法,因为它非常灵活,可以选择哪一列数据作为键,哪一列作为值。
import pandas as pd

df = pd.read_csv('coors.csv')

mydict = dict(zip(df['col1'],df['col2']))

将'col1'和'col2'替换为您想要作为键的列,将col2替换为您想要作为值的列。

嗨@Rob!欢迎来到SO并感谢您的贡献!不过,这里已经有一个使用pandas库的答案了:https://stackoverflow.com/a/47668182/311288。您能否澄清一下您的答案是否提供了另一种解决方案? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接