Nous allons voir sur cette page comment, à partir d’un dictionnaire, créer un fichier CSV, et réciproquement.
Du dictionnaire au CSV
Considérons le dictionnaire suivant:
data = {\ "Jean" : 152,\ "Paul" : 185,\ "Lucie" : 156,\ "Nathan" : 174,\ "Astrid" : 165}
On souhaite enregistrer les clés et les valeurs de ce dictionnaire dans un fichier CSV sous la forme:
Jean:152 Paul:185 ...
C’est possible en à peine 2 lignes:
with open('data.csv', 'w') as f: [f.write('{0}:{1}\n'.format(key, value)) for key, value in data.items()]
Le formatage du CSV est bien entendu modifiable. On pourrait tout aussi bien utiliser le code suivant:
with open('data.csv', 'w') as f: [f.write('{0},{1};'.format(key, value)) for key, value in data.items()]
pour avoir un fichier CSV de la forme:
Jean,152;Paul,185;Lucie,156;Nathan,174;Astrid,165;
Du CSV au dictionnaire
Premier formatage
Nous allons prendre le premier formatage, à savoir un couple (clé:valeur) par ligne. Dans ce cas, rien de bien long non plus:
data = {} with open('data.csv' , 'r') as f: for line in f: d = line.split(':') data[ d[0] ] = int ( d[1] ) print( data )
L’idée ici est de parcourir chaque ligne du fichier data.csv et, pour chacune d’elles, de la découper de part et d’autre du caractère “:” (avec la méthode split), qui crée ainsi une liste de deux éléments : la clé et sa valeur.
Second formatage
Le second formatage est légèrement plus compliqué, mais nous pouvons nous inspiré de ce qui vient d’être utilisé, et tout particulièrement la méthode split.
On peut en effet lire le fichier CSV, qui ne contient qu’une ligne, et la splitter selon le caractère “;”, puis à nouveau splitter les éléments de la liste créée selon le caractère “,”. Cela donne:
data = {} with open('data.csv' , 'r') as f: ligne = f.read() d = ligne.split(';') d.pop() for i in d: e = i.split(',') data[ e[0] ] = int ( e[1] ) print( data )
Cette méthode a pour inconvénient de créer en dernière position une entrée vide dans la liste “d” créée avec split (car le fichier CSV contient un “;” final après lequel il n’y a rien). C’est pourquoi j’ai utilisé la méthode pop(), qui supprime le dernier élément d’une liste.
Une autre façon de faire est:
data = {} with open('data.csv' , 'r') as f: ligne = f.read() d = ligne.split(';') for i in d: e = i.split(',') if len(e) == 2: data[ e[0] ] = int ( e[1] ) print( data )
Cette dernière façon de faire est mieux car elle fonctionne dans tous les cas : que le fichier CSV se termine par “;” ou non.