简体   繁体   中英

Read CSV data and add it into dictionary

This is an empty Dictionary

d = {}

This is the csv file data

M, Max, Sporting, Football, Cricket
M, Jack, Sporting, Cricket, Tennis
M, Kevin, Sporting, Cricket, Basketball
M, Ben, Sporting, Football, Rugby

I tried to use the following code to append data from the csv to dictionary.

with open('example.csv', "r") as csvfile:
        csv_reader = csv.reader(csvfile)
        for row in csv_reader:
            if row:
                d.setdefault(row[0], {})[row[1]] = {row[2]: [row[3]]}

But it gives me an error:

d.setdefault(row[0], {})[row[1]] = {row[2]: [row[3]]}
IndexError: list index out of range

It there any way, i can add data from csv to the dictionary, in the form:

d = {'M': {'Max': {'Sporting': ['Football', 'Cricket']}, 'Jack': {'Sporting': ['Cricket', 'Tennis']}}}

I am new to this so help me.

import csv

d={}
with open('JJ.csv', "r") as csvfile:
    csv_reader = csv.reader(csvfile)
    for row in csv_reader:
        if row:
            d.setdefault(row[0],{})[row[1]] = {row[2]: [row[3],row[4]]}
print(d)

{'M': {' Max': {' Sporting': [' Football', ' Cricket']}, ' Jack': {' Sporting': [' Cricket', ' Tennis']}, ' Kevin': {' Sporting': [' Cricket', ' Basketball']}, ' Ben': {' Sporting': [' Football', ' Rugby']}}}

To remove all the leading/trailing spaces in the output, you can use the below line instead. There might be a better way which I'm not sure as of now.

d.setdefault(row[0],{})[row[1].strip()] = {row[2].strip(): [row[3].strip(),row[4].strip()]}

You can use a nested collections.defaultdict tree and check if the rows are long enough:

from collections import defaultdict

def tree():
    return defaultdict(tree)    

d = tree()
# ...
for row in csv_reader:
    if len(row) >= 3:
        d[row[0]][row[1]][row[2]] = row[3:]

将“for csv_reader:”中的列更改为“for csv_reader中的行:”

Straightforwardly:

import csv, collections

with open('example.csv', 'r') as f:
    reader = csv.reader(f, skipinitialspace=True)
    result = collections.defaultdict(dict)
    for r in reader:
        if not result[r[0]].get(r[1]): result[r[0]][r[1]] = {}
        if not result[r[0]][r[1]].get(r[2]):
            result[r[0]][r[1]][r[2]] = r[-2:]

print(dict(result))

The output:

{'M': {'Kevin': {'Sporting': ['Cricket', 'Basketball']}, 'Max': {'Sporting': ['Football', 'Cricket']}, 'Jack': {'Sporting': ['Cricket', 'Tennis']}, 'Ben': {'Sporting': ['Football', 'Rugby']}}}

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