web-dev-qa-db-fra.com

Comment convertir cette liste de dictionnaires dans un fichier csv?

J'ai une liste de dictionnaires qui ressemble à 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 à ceci:

name,age,weight
bob,25,200
jim,31,180
103
Backus
import 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)

EDIT: Ma solution précédente ne gère pas la commande. Comme noté par Wilduck, DictWriter est plus approprié ici.

195
Matthew Flaschen

Dans le module csv Python, il existe un DictWriter qui sera probablement utile.

19
Wilduck

c'est quand vous avez une 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'})
11
hamed

Parce que @User et @BiXiC ont demandé de l'aide pour UTF-8, voici une variante de la solution de @Matthew. (Je ne suis pas autorisé à commenter, alors 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)
5
flowerflower

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 de dire au fichier CSV que votre fichier doit être ouvert avec le codage utf8, car cela rend ces données plus faciles à transférer aux autres (en supposant que vous n'utilisiez pas un codage plus restrictif, comme 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 en python 3 a besoin du paramètre newline='', sinon vous obtenez des lignes vides dans votre CSV lors de l’ouverture dans Excel/opencalc.

Sinon, je préfère utiliser le gestionnaire csv dans le module pandas. Je trouve qu'il est plus tolérant vis-à-vis des problèmes d'encodage et pandas convertira automatiquement les numéros de chaîne dans les CSV en types corrects (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)

Remarque:

  • pandas se chargera d’ouvrir le fichier pour vous si vous lui donnez un chemin, et utilisera par défaut utf8 en python3, ainsi que les en-têtes.
  • une structure de données n’est pas la même structure que celle que CSV vous donne, vous devez donc ajouter une ligne lors du chargement pour obtenir la même chose: dataframe.to_dict('records')
  • les pandas facilitent également beaucoup le contrôle de l'ordre des colonnes dans votre fichier csv. Par défaut, ils sont alphabétiques, mais vous pouvez spécifier l'ordre des colonnes. Avec le module Vanilla csv, vous devez l’alimenter avec une OrderedDict sinon elles apparaîtront dans un ordre aléatoire (si vous travaillez en python <3.5). Voir: Préservation de l'ordre des colonnes dans Python Pandas DataFrame pour plus d'informations.
1
Marc Maxmeister

Voici une autre solution plus générale, en supposant que vous n’ayez pas de liste de lignes (peut-être qu’elles ne tiennent pas dans la mémoire) ou une copie des en-têtes (peut-être que la fonction write_csv est générique):

def gen_rows():
    yield OrderedDict(name='bob', age=25, weight=200)
    yield OrderedDict(name='jim', age=31, weight=180)

def write_csv():
    it = genrows()
    first_row = it.next()  # __next__ in py3
    with open("people.csv", "w") as outfile:
        wr = csv.DictWriter(outfile, fieldnames=list(first_row))
        wr.writeheader()
        wr.writerow(first_row)
        wr.writerows(it)

Note : le constructeur OrderedDict utilisé ici ne conserve que l'ordre en python> 3.4. Si l'ordre est important, utilisez le formulaire OrderedDict([('name', 'bob'),('age',25)]).

0
eddygeek
import csv

with open('file_name.csv', 'w') as csv_file:
    writer = csv.writer(csv_file)
    writer.writerow(('colum1', 'colum2', 'colum3'))
    for key, value in dictionary.items():
        writer.writerow([key, value[0], value[1]])

Ce serait le moyen le plus simple d'écrire des données dans .csv file

0
jitesh mohite