从csv文件列中创建字典

use*_*714 4 python

我是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)
Run Code Online (Sandbox Code Playgroud)

问题:返回的输出仅用于前两列的"最后"或"最底部"行,即{'12654':'18790'}.我希望字典包含此格式的前两列的所有100行.怎么做?我可以在前两列的行号上运行一些循环来做那个...我不知道怎么做.

dev*_*erx 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
Run Code Online (Sandbox Code Playgroud)

这里:

mydict = {k:v}
Run Code Online (Sandbox Code Playgroud)

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

更新:

你可以做这样的事情:

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]}
Run Code Online (Sandbox Code Playgroud)

这样,将存储相同密钥的每个值

您的代码将是:

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
Run Code Online (Sandbox Code Playgroud)

Update2:你的意思是?

for k, v in mydict.items():
    print "%s: %s" % (k, v)

>>>
1: [2, 3]
2: [4]
3: [2, 4]
Run Code Online (Sandbox Code Playgroud)

UPDATE3:

这应该工作:

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
Run Code Online (Sandbox Code Playgroud)


utd*_*mir 5

您正在创建一个新的dict并在每次迭代时覆盖旧的dict.@develerx的答案解决了这个问题.我只是想用dict理解来指出一种更简单的方法:

假设csv文件包含两列.

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

如果您使用的是旧版本(我认为超过2.7),则不能使用dict理解,只需使用dict函数:

my_dict = dict((k, v) for k, v in reader)
Run Code Online (Sandbox Code Playgroud)

编辑:我只是想到了; my_dict = dict(reader)也可以工作.