221 votes

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 deuxième colonne contient des valeurs. Chaque ligne du fichier csv représente une paire clé/valeur unique dans le dictionnaire. J'ai essayé d'utiliser la fonction csv.DictReader y csv.DictWriter mais je n'ai pas trouvé comment générer un nouveau dictionnaire pour chaque ligne. Je veux un seul dictionnaire. Voici le code que j'essaie 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 j'exécute le code ci-dessus, j'obtiens un message ValueError: too many values to unpack (expected 2) . Comment créer un dictionnaire à partir d'un fichier csv ? Merci d'avance.

227voto

Nate Points 6155

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

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 = {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)

139voto

Ouvrez le fichier en appelant open et en utilisant ensuite csv.DictReader .

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

Vous pouvez itérer sur les lignes de l'objet lecteur du fichier csv en itérant sur input_file.

for row in input_file:
    print(row)

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

dictobj = csv.DictReader(open('coors.csv')).next() 

MISE À JOUR Dans les versions 3+ de Python, ce code sera légèrement modifié :

reader = csv.DictReader(open('coors.csv'))
dictobj = next(reader)

76voto

robert Points 10493
import csv
reader = csv.reader(open('filename.csv', 'r'))
d = {}
for row in reader:
   k, v = row
   d[k] = v

49voto

mudassirkhan19 Points 556

Ce n'est pas très élégant, mais c'est une solution en une ligne qui utilise pandas.

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

Si vous souhaitez spécifier le type de votre index (il ne peut pas être spécifié dans read_csv si vous utilisez l'argument index_col à cause d'une erreur de type insecte ) :

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

22voto

Alex Laskin Points 777

Il suffit de convertir csv.reader en 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'}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X