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.

15voto

conmak Points 396

En supposant que vous disposiez d'un fichier CSV de cette structure :

"a","b"
1,2
3,4
5,6

Et vous voulez que le résultat soit :

[{'a': '1', ' "b"': '2'}, {'a': '3', ' "b"': '4'}, {'a': '5', ' "b"': '6'}]

Une fonction de fermeture éclair (qui n'a pas encore été mentionnée) est simple et très utile.

def read_csv(filename):
    with open(filename) as f:
        file_data=csv.reader(f)
        headers=next(file_data)
        return [dict(zip(headers,i)) for i in file_data]

Si vous préférez les pandas, il peut aussi le faire très bien :

import pandas as pd
def read_csv(filename):
    return pd.read_csv(filename).to_dict('records')

13voto

Thiru Points 164

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 }

9voto

Trideep Rath Points 1

Solution à une ligne

import pandas as pd

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

8voto

yellow01 Points 582

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 modules intégrés

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'}}

Note : Les dictionnaires Python ont des clés uniques, donc si votre fichier csv a des doubles 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)})

5voto

gnibbler Points 103484

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)

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