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
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.
Dans le module csv Python, il existe un DictWriter qui sera probablement utile.
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'})
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)
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)
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:
utf8
en python3, ainsi que les en-têtes.dataframe.to_dict('records')
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.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)])
.
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