web-dev-qa-db-fra.com

É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 rangée et toutes les valeurs dans la rangée suivante.

Lorsque je parviens à écrire un fichier comme celui-ci, je souhaite également le relire dans un nouveau dictionnaire.

Juste pour expliquer mon code, le dictionnaire contient des valeurs et des bool de textctrls et des cases à cocher (en utilisant wxpython). Je souhaite ajouter les boutons "Enregistrer les paramètres" et "Charger les paramètres" . Les paramètres d'enregistrement doivent écrire le dictionnaire dans le fichier de la manière indiquée (pour permettre à l'utilisateur de modifier directement le fichier csv), lire le fichier et mettre à jour les textctrls et les cases à cocher.

65
user1106770

La DictWriter ne fonctionne pas comme prévu.

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)

ce qui est assez compact, mais il suppose que vous n’avez pas besoin de faire de conversion de type lors de la lecture

142
Ricardo Cárdenes

Le moyen 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()]
10
Phil Horowitz

Juste pour donner une option, écrire un dictionnaire dans un fichier csv pourrait aussi être fait avec le paquet pandas. Avec l'exemple donné, cela pourrait ressembler à 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' dans la méthode from_dict . Cela vous permet de choisir si vous souhaitez écrire chaque clé de dictionnaire dans une nouvelle ligne. 

De plus, dans la méthode to_csv , le paramètre d’en-tête est défini sur False pour ne contenir que les éléments du dictionnaire sans lignes gênantes. Vous pouvez toujours définir des noms de colonne et d'index dans la méthode To_csv.

Votre sortie ressemblerait à ceci:

key1,a
key2,b
key3,c

Si vous souhaitez plutôt que les clés correspondent aux noms des colonnes, utilisez simplement le paramètre par défaut "orient" qui est "colonnes", comme vous pouvez le vérifier dans les liens de la documentation.

7
Ivan Calderon
outfile = open( 'dict.txt', 'w' )
for key, value in sorted( mydict.items() ):
    outfile.write( str(key) + '\t' + str(value) + '\n' )
3
FCAlive

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

2
louis.luo

J'ai personnellement toujours trouvé le module csv assez ennuyant. Je m'attends à ce que quelqu'un d'autre vous montre comment le faire en douceur, mais ma solution rapide et sale est la suivante:

with open('dict.csv', 'w') as f:  # This creates the file object for the context 
                                  # below it and closes the file automatically
    l = []
    for k, v in mydict.iteritems(): # Iterate over items returning key, value tuples
        l.append('%s: %s' % (str(k), str(v))) # Build a Nice list of strings
    f.write(', '.join(l))                     # Join that list of strings and write out

Toutefois, si vous souhaitez le relire, vous devrez procéder à une analyse syntaxique agaçante, surtout si tout est sur une seule ligne. Voici un exemple utilisant votre format de fichier proposé.

with open('dict.csv', 'r') as f: # Again temporary file for reading
    d = {}
    l = f.read().split(',')      # Split using commas
    for i in l:
        values = i.split(': ')   # Split using ': '
        d[values[0]] = values[1] # Any type conversion will need to happen here
1
Griffith Rees
import csv

dict = {"Key Header":"Value Header", "key1":"value1", "key2":"value2"}

with open("test.csv", "w") as f:
    writer = csv.writer(f)
    for i in dict:
      writer.writerow([i, dict[i]])
f.close() 

enter image description here

0
Apurva Thorat

Haha, mais aussi, avez-vous essayé d'ajouter le "s" sur: w.writerow (mydict) comme ceci: w.writerows (mydict), ce problème m'est arrivé mais avec listes, j’utilisais singulier au lieu de pluriel. Pops! était correct.

0
Hikhuj