Python尝试读取csv文件到字典时出错

时间:2017-08-10 09:36:55

标签: python csv dictionary

我正在尝试从csv文件读取字典。问题是我每行有3个值(不仅仅是2个)并且想要转换为dict,其中第一个值是键,最后2个值组合成单个值(例如使用列表或元组)。举个例子,我在csv中有以下内容:

Calcium Enriched 100% Lactose Free Fat Free Milk,2346,57876.0

Large Organic Omega3 Brown Eggs,2568,86280.0

Roasted & Salted Shelled Pistachios,919,29358.0

Chocolate Peanut Butter Protein Bar,801,21296.0

...

我希望输出是这样的:

{'Calcium Enriched 100% Lactose Free Fat Free Milk': [2346,57876.0]}

{'Large Organic Omega3 Brown Eggs': [2568,86280.0]}

{'Roasted & Salted Shelled Pistachios': [919,29358.0]}

{'Chocolate Peanut Butter Protein Bar': [801,21296.0]}

我试着按照这样的正常方式去做:

with open('avg_prod_reorder_time.csv', 'r', encoding='utf-8') as csv_file:
    reader = csv.reader(csv_file)
    avg_prod_reorder_time = dict(reader)

但是我收到以下错误:

ValueError: dictionary update sequence element #0 has length 3; 2 is required

如何解决这个问题?感谢。

3 个答案:

答案 0 :(得分:0)

您无需使用csv。只需逐行读取文件并将其拆分。

with open("data.csv", 'r') as f:
    for line in f:
        key, *value = line.rstrip("\n").split(',')
        result = {key: list(value)}

答案 1 :(得分:0)

这会创建一个你想要的字典:

avg_prod_reorder_time = {r[0]: r[1:] for r in reader if r}

dict由键/值对组成,但您的数据不是成对格式化的。上面的代码将第一个元素作为键,并形成所有剩余元素的列表。条件if r会跳过空行。

答案 2 :(得分:0)

考虑你有一个像这样的csv文件,

<强> some.csv

Hello ,1,2
There ,2,3
Friend ,4,5

你可以试试这个,

import csv
mydict = {}
with open("some.csv","r+") as c:
    r = csv.reader(c)
    for row in r:
        mydict[row[0]] = row[1:]
print(mydict)

输出:

{'Friend ': ['4', '5'], 'Hello ': ['1', '2'], 'There ': ['2', '3']}

<强>说明:

这是您感兴趣的部分,

r = csv.reader(c)
for row in r:
    mydict[row[0]] = row[1:]

我们在这里指定

带有mydict[row[0]]

row[1:]

即第一个

带有mydict['Hello']的{​​p> row[1:],即[1,2]#List slicing

与其他行类似。

注意:

列表切片意味着根据索引切片列表, 如果您不了解它们,请尝试此操作。一般形式是这样的,

your_list [start:stop]

注意开始包含停止是独占的

>>> a = [1,2,3,4]
>>> a[0]
1
>>> a[1:]
[2, 3, 4]
>>> a[2:]
[3, 4]
>>> a[3:]
[4]
>>> a[:2]
[1, 2]
>>> a[:3]
[1, 2, 3]
>>> a[:1]
[1]