125 votes

Écriture d'un dictionnaire dans un fichier csv avec une ligne pour chaque "clé : valeur".

J'ai un dictionnaire :

mydict = {key1: value_a, key2: value_b, key3: value_c}

Je veux écrire les données dans un fichier dict.csv, dans ce style :

key1: value_a
key2: value_b
key3: value_c

J'ai écrit :

import csv
f = open('dict.csv','wb')
w = csv.DictWriter(f,mydict.keys())
w.writerow(mydict)
f.close()

Mais maintenant, j'ai toutes les clés dans une ligne et toutes les valeurs dans la ligne suivante

Lorsque je parviens à écrire un tel fichier, je veux aussi le relire dans un nouveau dictionnaire.

Juste pour expliquer mon code, le dictionnaire contient des valeurs et des bools provenant de textrls et de checkboxes (en utilisant wxpython). Je veux ajouter des boutons "Enregistrer les paramètres" et "Charger les paramètres". Save settings doit écrire le dictionnaire dans le fichier de la manière mentionnée (pour faciliter l'édition du fichier csv par l'utilisateur), load settings doit lire le fichier et mettre à jour les textrls et les checkboxes.

244voto

Ricardo Cárdenes Points 4636

En DictWriter ne fonctionne pas comme vous l'attendez.

with open('dict.csv', 'w') as csv_file:  
    writer = csv.writer(csv_file)
    for key, value in mydict.items():
       writer.writerow([key, value])

Pour le relire :

with open('dict.csv') as csv_file:
    reader = csv.reader(csv_file)
    mydict = dict(reader)

qui est assez compacte, mais qui suppose que vous n'avez pas besoin de faire de conversion de type lors de la lecture.

39voto

Ivan Calderon Points 470

Juste pour donner une option, l'écriture d'un dictionnaire dans un fichier csv pourrait aussi être faite avec le paquet pandas. Avec l'exemple donné, cela pourrait être quelque chose comme ceci :

mydict = {'key1': 'a', 'key2': 'b', 'key3': 'c'}

import pandas as pd

(pd.DataFrame.from_dict(data=mydict, orient='index')
   .to_csv('dict_file.csv', header=False))

La principale chose à prendre en compte est de définir le paramètre 'orient' sur 'index' à l'intérieur de la balise from_dict méthode. Cela vous permet de choisir si vous voulez écrire chaque clé du dictionnaire dans une nouvelle ligne.

De plus, à l'intérieur du to_csv le paramètre header est mis à False pour n'avoir que les éléments du dictionnaire sans rangées gênantes. Vous pouvez toujours définir les noms de colonne et d'index dans la méthode to_csv.

Votre résultat devrait ressembler à ceci :

key1,a
key2,b
key3,c

Si vous voulez que les clés soient les noms des colonnes, utilisez simplement le paramètre 'orient' par défaut qui est 'columns', comme vous pouvez le vérifier dans les liens de la documentation.

16voto

Phil Horowitz Points 1

Le plus simple est d'ignorer le module csv et de le formater vous-même.

with open('my_file.csv', 'w') as f:
    [f.write('{0},{1}\n'.format(key, value)) for key, value in my_dict.items()]

7voto

user2815194 Points 11
outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )

2voto

Louis_PIG Points 1463

Pouvez-vous juste faire :

for key in mydict.keys():
    f.write(str(key) + ":" + str(mydict[key]) + ",");

Pour que vous puissiez avoir

clé_1 : valeur_1, clé_2 : valeur_2

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