web-dev-qa-db-fra.com

Comment écrire un dictionnaire Python dans un fichier csv?

J'ai ce que je pense devrait être une tâche très facile que je ne semble pas pouvoir résoudre.

Comment écrire un dictionnaire Python dans un fichier csv? Tout ce que je veux, c’est d’écrire les clés du dictionnaire sur la première ligne du fichier et les valeurs de la clé sur la deuxième ligne.

Le plus proche que je suis venu est le suivant (que j'ai eu de quelqu'un d'autre post):

f = open('mycsvfile.csv','wb')
w = csv.DictWriter(f,my_dict.keys())
w.writerows(my_dict)
f.close()

Le problème est que le code ci-dessus semble n'écrire que les clés de la première ligne et c'est tout. Je ne reçois pas les valeurs écrites à la deuxième ligne.

Des idées?

101
CraigP

Vous utilisez DictWriter.writerows() qui attend une liste de dictés, pas un dict. Vous voulez que DictWriter.writerow() écrive une seule ligne.

Vous voudrez aussi utiliser DictWriter.writeheader() si vous voulez un en-tête pour votre fichier csv.

Vous pouvez également vouloir extraire l'instruction with pour ouvrir des fichiers . Il est non seulement plus lisible et lisible, mais gère également la fermeture pour vous, même en cas d’exceptions.

Exemple avec ces modifications apportées:

import csv

my_dict = {"test": 1, "testing": 2}

with open('mycsvfile.csv', 'wb') as f:  # Just use 'w' mode in 3.x
    w = csv.DictWriter(f, my_dict.keys())
    w.writeheader()
    w.writerow(my_dict)

Qui produit:

test,testing
1,2
167
Gareth Latty

Votre code était très prêt à fonctionner.

Essayez d’utiliser un csv.writer plutôt qu'un DictWriter. Ce dernier est principalement utilisé pour rédiger une liste de dictionnaires.

Voici un code qui écrit chaque paire clé/valeur sur une ligne distincte:

import csv

somedict = dict(raymond='red', rachel='blue', matthew='green')
with open('mycsvfile.csv','wb') as f:
    w = csv.writer(f)
    w.writerows(somedict.items())

Si vous voulez plutôt que toutes les clés sur une ligne et toutes les valeurs sur la suivante, c'est aussi simple:

with open('mycsvfile.csv','wb') as f:
    w = csv.writer(f)
    w.writerow(somedict.keys())
    w.writerow(somedict.values())

Astuce: Lorsque vous développez un code comme celui-ci, réglez le rédacteur sur w = csv.writer(sys.stderr) pour que vous puissiez plus facilement voir ce qui est généré. Lorsque la logique est terminée, revenez à w = csv.writer(f).

81
Raymond Hettinger