从CSV文件列创建字典

4

我是一个对Python中的字典概念不熟悉的新手。 我有一个包含多列的CSV文件,我想创建一个字典,使得键从第一列中获取,值从第二列中获取,并且为这两列的所有行创建一个键:值对。 代码如下:

    if __name__=="__main__":
reader = csv.reader(open("file.csv", "rb"))
for rows in reader:
        k = rows[0]
        v = rows[1]
        mydict = {k:v}
print (mydict)

问题:返回结果只适用于第一列和第二列中的“最后”或“最底部”行,即{'12654':'18790'}。我希望字典包含所有100行的前两列以这种格式。该怎么做?我可以在前两列的行号上运行一些循环来实现吗……我不知道如何做。

你的意思是键从第一行中取出吗? - Hod - Monica's Army
这段代码从最后一行获取键(最后一行的两列),但我希望它按顺序从第一行到最后一行覆盖文件中每一行的两列。 - user899714
2个回答

6
if __name__=="__main__":
    mydict = {}
    reader = csv.reader(open("file.csv", "rb"))
    for rows in reader:
        k = rows[0]
        v = rows[1]
        mydict[k] = v
    print mydict

在这里:

mydict = {k:v}

您在每次迭代中都创建了新的字典,之前的数据已经丢失。

更新:

您可以像这样做:

mydict = {}
L = [(1, 2), (2, 4), (1, 3), (3, 2), (3, 4)]
for el in L:
    k, v = el
    if not k in mydict:
        mydict[k] = [v]
    else:
        mydict[k].append(v)

print mydict

>>> 
{1: [2, 3], 2: [4], 3: [2, 4]}

这样,相同键的每个值都将被存储。
您的代码将是:
if __name__=="__main__":
    mydict = {}
    reader = csv.reader(open("file.csv", "rb"))
    for i, rows in enumerate(reader):
        if i == 0: continue
        k = rows[0]
        v = rows[1]
        if not k in mydict:
            mydict[k] = [v]
        else:
            mydict[k].append(v)

    print mydict

更新2:您的意思是?
for k, v in mydict.items():
    print "%s: %s" % (k, v)

>>>
1: [2, 3]
2: [4]
3: [2, 4]

更新3:
这个应该有效:
```html

这应该有效:

```
if __name__=="__main__":
        mydict = {}
        reader = csv.reader(open("file.csv", "rb"))
        for i, rows in enumerate(reader):
            if i == 0: continue
            k = rows[0]
            v = rows[1]
            if not k in mydict:
                mydict[k] = [v]
            else:
                mydict[k].append(v)

        print mydict

两个代码都可以工作,但只能部分解决问题,因为字典中的键值对在所有行(即第1行、第2行、第3行等)中并不是按顺序排列的,而是随机生成的,并且不包括所有100行。这是因为列中有许多重复的键值吗?而字典中的键必须是唯一的吗? - user899714
在我的数据的两列中...值被重复了。例如,如果第8行有12345:90873,则第48行可以有90873:12345。而在其他行中,12345的配对是不同的,例如12345:87632,90873:76004也是如此。 - user899714
非常感谢。这将列出键为12345的所有值,其中12345位于第一列,并且存储在字典中的第1列中与12345对应的所有第2列的值。 - user899714
还有一件事...如果我想单独打印每个{key:[value,value]},即在一行中列出每个键:值组合,下一个键:值在另一行中,以此类推,仍然在同一个字典中...我能用这种方式分隔字典内容吗? - user899714
或者我可以按行获取它吗?...对于第一行:key1:value1,对于第二行:key2:value2等等...即使某些键在col1中重复出现,其'values'是不同的,或者在col1中的一个键是col2中的'value'。我真的希望这样说得清楚... - user899714
更新2很好! :) 在这里,我还为每列都给出了一个标题,这些标题在两列的第一行中。它们也会被打印在字典中:S 可以跳过第一行标题行,并从文件的第二行开始制作字典,直到结尾吗? - user899714

5
你正在创建一个新的字典并在每次迭代时覆盖旧字典。@develerx的答案解决了这个问题。我只是想指出一种更简单的方法,使用字典推导式:

假设csv文件包含两列。

if __name__=="__main__":
    reader = csv.reader(open("file.csv", "rb"))
    my_dict = {k: v for k, v in reader}
    print mydict

如果您正在使用旧版本(我认为早于2.7),则无法使用字典推导式,只需使用dict函数即可:

my_dict = dict((k, v) for k, v in reader)

编辑:我刚刚想到,my_dict = dict(reader) 也可以工作。

你可以使用第二个或第三个。 - utdemir

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