简体   繁体   中英

How to open CSV with multiple values in each row and store it in a nested dictionary?

I'm new to python and trying to do the following:

Open a CSV file with 5 different values separated by comma.

I want to store the data in a dictionary which key will be row[0] .

Suppose there are 4 rows so 4 primary keys, for each key I need to create another nested dictionary with 4 new keys, each key with the values of rows 1, 2, 3 and 4.

Let's say the CSV contains:

1,hi,1,2,3
2,yes,2,3,4
3,no,3,4,5
4,why,4,5,6

and I need to store:

dict={'1': { 'key2':hi,'key3':1,'key4':2,'key5':3}, '2':{ }, '3':{}, '4':{} }

This is the code I'm using

import csv
dict={}
    reader = csv.reader(open('filename.csv', 'r'))
    for row in reader:
        key=row[0]
        for key in dict:
           dict[key]={}
           dict[key][key2]=row[1]
           dict[key][key3]=row[2]
           dict[key][key4]=row[3]
           dict[key][key5]=row[4]

What am I missing?

The reason your code doesn't work is because for each row you are iterating over keys of an empty dictionary for key in dict resulting in no actions being taken.

Instead, if you would like to insert {'key2': row[1], 'key3': row[2], 'key4': row[3], 'key5': row[4]} to dict[row[0]] try the following. Also, avoid using variables named after builtin types, ie list , set , all , dict .

import csv
output_dict = {}
with open('filename.csv', 'r') as f:    
    reader = csv.reader(f)
    for row in reader:
      output_dict[row[0]] = {'key%d' % (i + 1): row[i] for i in xrange(1, 5)}

Here is code that does what you are asking:

import csv
my_dictionary = {}
reader = csv.reader(open('filename.csv', 'r'))
for row in reader:
    my_dictionary[row[0]] = {}
    for index in range(1, len(row)):
        my_dictionary[row[0]]['key' + str(index)] = row[index]

You should avoid naming a dictionary 'dict' because that is the name of the function that creates dictionary objects. Also, the variable 'key' gets overwritten by your iterator variable.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM