Come posso convertire questo elenco di dizionari in un file CSV?


Risposte:


284
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: la mia soluzione precedente non gestisce l'ordine. Come notato da Wilduck, DictWriter è più appropriato qui.


11
Si noti che un modo più pitonico di aprire (e chiudere) i file èwith open('people.csv', 'wb') as f: ...
gozzilli,

6
Puoi usare dict_writer.writeheader()invece didict_writer.writer.writerow(keys)
megawac l'

8
Non funziona se la prima voce dell'elenco non contiene tutte le chiavi
greg121,

61
in Python 3 èopen('people.csv', 'w')
Zev Averbach

3
set().union(*(d.keys() for d in mylist))per ottenere tutte le chiavi nell'elenco (se ne hai alcune che non hanno tutte le chiavi).
Julian Camilleri,

17

questo è quando hai un elenco di dizionari:

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'})

17

In Python 3 le cose sono leggermente diverse, ma molto più semplici e meno soggette a errori. È una buona idea dire al CSV che il tuo file dovrebbe essere aperto con la utf8codifica, poiché rende i dati più portabili agli altri (supponendo che tu non stia utilizzando una codifica più restrittiva, come 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)
  • Si noti che csvin Python 3 è necessario il newline=''parametro, altrimenti si ottengono righe vuote nel CSV quando si apre in Excel / Opencalc.

In alternativa: preferisco usare il gestore CSV nel pandasmodulo. Trovo che sia più tollerante nei confronti dei problemi di codifica e i panda convertiranno automaticamente i numeri di stringa nei CSV nel tipo corretto (int, float, ecc.) Durante il caricamento del file.

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

Nota:

  • Panda si occuperà di aprire il file per te se gli dai un percorso, e lo farà di default utf8in python3, e capire anche le intestazioni.
  • un dataframe non ha la stessa struttura di quello che ti offre CSV, quindi aggiungi una riga al caricamento per ottenere la stessa cosa: dataframe.to_dict('records')
  • Panda rende anche molto più facile controllare l'ordine delle colonne nel tuo file CSV. Per impostazione predefinita, sono alfabetici, ma è possibile specificare l'ordine delle colonne. Con il csvmodulo vanilla , è necessario alimentarlo OrderedDicto appariranno in un ordine casuale (se si lavora in Python <3.5). Vedi: Preservare l'ordine delle colonne in DataFrame di Python Pandas per ulteriori informazioni.

7

Perché @User e @BiXiC hanno chiesto aiuto con UTF-8 qui una variante della soluzione di @Matthew. (Non posso commentare, quindi rispondo.)

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)

2
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]])

Questo sarebbe il modo più semplice per scrivere i dati nel file .csv


1

Ecco un'altra soluzione più generale supponendo che tu non abbia un elenco di righe (forse non si adattano alla memoria) o una copia delle intestazioni (forse la write_csvfunzione è generica):

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)

Nota : il costruttore OrderedDict usato qui conserva solo l'ordine in python> 3.4. Se l'ordine è importante, utilizzare il OrderedDict([('name', 'bob'),('age',25)])modulo.


mai visto nessuno archiviare dati in un generatore prima d'ora - approccio interessante.
Marc Maxmeister,

1
import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
header=['name','age','weight']     
try:
   with open('output'+str(date.today())+'.csv',mode='w',encoding='utf8',newline='') as output_to_csv:
       dict_csv_writer = csv.DictWriter(output_to_csv, fieldnames=header,dialect='excel')
       dict_csv_writer.writeheader()
       dict_csv_writer.writerows(toCSV)
   print('\nData exported to csv succesfully and sample data')
except IOError as io:
    print('\n',io)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.