277 votes

Comment convertir cette liste de dictionnaires en un fichier csv ?

J'ai une liste de dictionnaires qui ressemble à quelque chose comme ceci :

toCSV = [{'name':'bob','age':25,'weight':200},{'name':'jim','age':31,'weight':180}]

Que dois-je faire pour convertir cela en un fichier csv qui ressemble à quelque chose comme ceci :

name,age,weight
bob,25,200
jim,31,180

0 votes

485voto

Matthew Flaschen Points 131723
import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'w', newline='')  as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)

0 votes

Existe-t-il un moyen de faire cela lorsque les données sont intégrées ? Par exemple, si c'est {{"first" : "John", "last" : "Doe"}, uri} pour chaque entrée du tableau mais que vous voulez que le csv ne contienne que les données du premier et du dernier ?

0 votes

Comment puis-je écrire un fichier comme celui-ci au format CSV si les valeurs du dictionnaire contiennent des symboles cyrilliques ? J'ai essayé .encode('utf-8') mais malheureusement les valeurs ne s'affichent pas correctement dans le fichier CSV.

0 votes

Ce programme écrit la sortie dans l'ordre inverse comme weightage nom poids 25 bob 200 31 jim 180

39voto

Marc Maxmeister Points 1789

En python 3, les choses sont un peu différentes, mais beaucoup plus simples et moins sujettes aux erreurs. C'est une bonne idée d'indiquer au CSV que votre fichier doit être ouvert avec utf8 car il rend ces données plus portables pour les autres (en supposant que vous n'utilisez pas un encodage plus restrictif, comme le latin1 )

import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
with open('people.csv', 'w', encoding='utf8', newline='') as output_file:
    fc = csv.DictWriter(output_file, 
                        fieldnames=toCSV[0].keys(),

                       )
    fc.writeheader()
    fc.writerows(toCSV)
  • Notez que csv dans python 3 a besoin de l'option newline='' sinon vous obtenez des lignes vides dans votre CSV lors de l'ouverture dans Excel/opencalc.

Alternativement : Je préfère utiliser le gestionnaire de csv dans l'application pandas module. Je trouve qu'il est plus tolérant aux problèmes d'encodage, et pandas convertira automatiquement les nombres de type chaîne dans les CSV dans le type correct (int, float, etc) lors du chargement du fichier.

import pandas
dataframe = pandas.read_csv(filepath)
list_of_dictionaries = dataframe.to_dict('records')
dataframe.to_csv(filepath)

Note :

  • pandas se chargera d'ouvrir le fichier pour vous si vous lui donnez un chemin, et choisira par défaut utf8 en python3, et comprendre les en-têtes aussi.
  • un dataframe n'a pas la même structure que ce que CSV vous donne, donc vous ajoutez une ligne au chargement pour obtenir la même chose : dataframe.to_dict('records')
  • pandas permet également de contrôler beaucoup plus facilement l'ordre des colonnes dans votre fichier csv. Par défaut, elles sont classées par ordre alphabétique, mais vous pouvez spécifier l'ordre des colonnes. Avec vanilla csv vous devez lui fournir un OrderedDict ou ils apparaîtront dans un ordre aléatoire (si vous travaillez avec python < 3.5). Voir : Préserver l'ordre des colonnes dans un DataFrame Python Pandas pour plus.

4 votes

Comment la liste des dictionnaires est-elle écrite en CSV ? Je n'arrive pas à comprendre le deuxième exemple de code.

0 votes

@IainSamuelMcLeanElder .to_dict renvoie votre dataframe dans un des différents formats, en fonction de ce que vous avez spécifié. ('records') renvoie une liste de dictionnaires où chaque colonne est un dictionnaire, et .to_dict('index') renvoie un dictionnaire de dictionnaires, les clés de niveau supérieur étant les valeurs d'index, et le dictionnaire imbriqué étant column:value paires. Selon la façon dont vous exportez votre csv, vous choisissez la structure attendue par la fonction CSV.

5 votes

Votre deuxième exemple de code ne semble pas répondre à la question de l'OP. Ne devrait-il pas utiliser from_dict quelque part ? J'ai eu le même problème et c'est ce qui a fonctionné pour moi. C'est bon à savoir pour to_dict, mais cela semble plus pertinent pour la lecture que pour l'écriture.

19voto

user455806 Points 36

C'est lorsque vous avez une seule liste de dictionnaires :

import csv
with open('names.csv', 'w') as csvfile:
    fieldnames = ['first_name', 'last_name']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'first_name': 'Baked', 'last_name': 'Beans'})

12voto

Wilduck Points 5116

Dans le module csv de Python, il existe une fonction DictWriter qui sera probablement utile.

9voto

flowerflower Points 132

Parce que @User et @BiXiC ont demandé de l'aide avec UTF-8, voici une variante de la solution de @Matthew. (Je ne suis pas autorisé à commenter, donc je réponds).

import unicodecsv as csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)

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