web-dev-qa-db-fra.com

Créer un dictionnaire à partir d'un fichier csv?

J'essaie de créer un dictionnaire à partir d'un fichier csv. La première colonne du fichier csv contient des clés uniques et la seconde colonne contient des valeurs. Chaque ligne du fichier csv représente une clé unique, une paire de valeurs dans le dictionnaire. J'ai essayé d'utiliser les classes csv.DictReader et csv.DictWriter , mais je ne savais que créer un nouveau dictionnaire pour chaque ligne. Je veux un dictionnaire. Voici le code que j'essaye d'utiliser:

import csv

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
    writer = csv.writer(outfile)
    for rows in reader:
        k = rows[0]
        v = rows[1]
        mydict = {k:v for k, v in rows}
    print(mydict)

Lorsque je lance le code ci-dessus, je reçois une ValueError: too many values to unpack (expected 2). Comment créer un dictionnaire à partir d'un fichier csv? Merci.

94
drbunsen

Je crois que la syntaxe que vous recherchiez est la suivante:

with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = {rows[0]:rows[1] for rows in reader}

Alternativement, pour python <= 2.7.1, vous voulez:

mydict = dict((rows[0],rows[1]) for rows in reader)
115
Nate

Ouvrez le fichier en appelant open puis csv.DictReader.

input_file = csv.DictReader(open("coors.csv"))

Vous pouvez parcourir les lignes de l’objet de lecture de dict du fichier csv en effectuant une itération sur input_file. 

for row in input_file:
    print row

OU Pour accéder à la première ligne uniquement

dictobj = csv.DictReader(open('coors.csv')).next() 
48
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v
46
robert

Vous devez simplement convertir csv.reader to dict:

~ >> cat > 1.csv
key1, value1
key2, value2
key2, value22
key3, value3

~ >> cat > d.py
import csv
with open('1.csv') as f:
    d = dict(filter(None, csv.reader(f)))

print(d)

~ >> python d.py
{'key3': ' value3', 'key2': ' value22', 'key1': ' value1'}
15
Alex Laskin

Vous pouvez également utiliser numpy pour cela.

from numpy import loadtxt
key_value = loadtxt("filename.csv", delimiter=",")
mydict = { k:v for k,v in key_value }
11
Thiru

Ce n'est pas élégant, mais une solution à une ligne utilisant des pandas.

import pandas as pd
pd.read_csv('coors.csv', header=None, index_col=0, squeeze=True).to_dict()

Si vous souhaitez spécifier dtype pour votre index (vous ne pouvez pas le spécifier dans read_csv si vous utilisez l'argument index_col à cause d'un bug ):

import pandas as pd
pd.read_csv('coors.csv', header=None, dtype={0: str}).set_index(0).squeeze().to_dict()
10
mudassirkhan19

Je suggère d'ajouter if rows au cas où il y aurait une ligne vide à la fin du fichier.

import csv
with open('coors.csv', mode='r') as infile:
    reader = csv.reader(infile)
    with open('coors_new.csv', mode='w') as outfile:
        writer = csv.writer(outfile)
        mydict = dict(row[:2] for row in reader if row)
4
John La Rooy

Si vous êtes d'accord avec l'utilisation du package numpy, vous pouvez effectuer les opérations suivantes:

import numpy as np

lines = np.genfromtxt("coors.csv", delimiter=",", dtype=None)
my_dict = dict()
for i in range(len(lines)):
   my_dict[lines[i][0]] = lines[i][1]
3
cloudyBlues

Vous pouvez utiliser ça, c'est plutôt cool:

import dataconverters.commas as commas
filename = 'test.csv'
with open(filename) as f:
      records, metadata = commas.parse(f)
      for row in records:
            print 'this is row in dictionary:'+rowenter code here
1
hamed

Solution monocouche

import pandas as pd

dict = {row[0] : row[1] for _, row in pd.read_csv("file.csv").iterrows()}
0
Trideep Rath

Essayez d'utiliser un defaultdict et DictReader.

import csv
from collections import defaultdict
my_dict = defaultdict(list)

with open('filename.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    for line in csv_reader:
        for key, value in line.items():
            my_dict[key].append(value)

Il retourne:

{'key1':[value_1, value_2, value_3], 'key2': [value_a, value_b, value_c], 'Key3':[value_x, Value_y, Value_z]}
0
Paulo Henrique Zen

Pour les fichiers csv simples, tels que les suivants

id,col1,col2,col3
row1,r1c1,r1c2,r1c3
row2,r2c1,r2c2,r2c3
row3,r3c1,r3c2,r3c3
row4,r4c1,r4c2,r4c3

Vous pouvez le convertir en un dictionnaire Python en utilisant uniquement les fonctions intégrées.

with open(csv_file) as f:
    csv_list = [[val.strip() for val in r.split(",")] for r in f.readlines()]

(_, *header), *data = csv_list
csv_dict = {}
for row in data:
    key, *values = row   
    csv_dict[key] = {key: value for key, value in Zip(header, values)}

Cela devrait donner le dictionnaire suivant

{'row1': {'col1': 'r1c1', 'col2': 'r1c2', 'col3': 'r1c3'},
 'row2': {'col1': 'r2c1', 'col2': 'r2c2', 'col3': 'r2c3'},
 'row3': {'col1': 'r3c1', 'col2': 'r3c2', 'col3': 'r3c3'},
 'row4': {'col1': 'r4c1', 'col2': 'r4c2', 'col3': 'r4c3'}}

Remarque: Les dictionnaires Python ont des clés uniques. Par conséquent, si votre fichier csv contient des doublons ids, vous devez ajouter chaque ligne à une liste.

for row in data:
    key, *values = row

    if key not in csv_dict:
            csv_dict[key] = []

    csv_dict[key].append({key: value for key, value in Zip(header, values)})
0
yellow01

De nombreuses solutions ont été publiées et j'aimerais contribuer avec la mienne, qui fonctionne pour un nombre différent de colonnes dans le fichier CSV. Il crée un dictionnaire avec une clé par colonne et la valeur de chaque clé est une liste avec les éléments de cette colonne.

    input_file = csv.DictReader(open(path_to_csv_file))
    csv_dict = {elem: [] for elem in input_file.fieldnames}
    for row in input_file:
        for key in csv_dict.keys():
            csv_dict[key].append(row[key])
0
Alejandro Villegas