Domanda

Ho un elenco di dizionari che assomiglia a questo:

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

Cosa devo fare per convertirlo in un file CSV simile a questo:

name,age,weight
bob,25,200
jim,31,180
È stato utile?

Soluzione

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 prima non gestisce l'ordine. Come notato da Wilduck, DictWriter è più appropriato qui.

Altri suggerimenti

questo è quando si dispone di una lista dizionario:

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

A causa @User e @BiXiC chiesto aiuto con UTF-8 qui una variante della soluzione da @ Matteo. (Io non sono autorizzato a commentare, in modo da sto rispondendo.)

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)

In Python 3 le cose sono un po 'diverso, ma il modo più semplice e meno soggetto a errori. E 'una buona idea per dire al CSV il file deve essere aperto con la codifica utf8, in quanto rende che i dati più portabile ad altri (supponendo non utilizzano 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 csv in Python 3 ha bisogno il parametro newline='', altrimenti si ottiene righe vuote nel CSV durante l'apertura in Excel / OpenCalc.

In alternativa: preferisco utilizzare al gestore csv nel modulo pandas. Trovo che sia più tollerante di problemi di codifica, e panda verrà automaticamente convertire i numeri in stringhe 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 prenderà cura di aprire il file per voi, se si dà un percorso, e sarà di default a utf8 in python3, e capire le intestazioni troppo.
  • un dataframe non è la stessa struttura di quello che ti dà CSV, in modo da aggiungere 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 file CSV. Per impostazione predefinita, sono alfabetico, ma è possibile specificare l'ordine delle colonne. Con il modulo csv vaniglia, è necessario alimentarlo un OrderedDict o verranno visualizzate in ordine casuale (se si lavora in python <3.5). Vedi: Preservare ordine delle colonne in Python Panda dataframe per più

Ecco un'altra soluzione più generale presupponendo che tu non abbia un elenco di righe (forse non entrano in memoria) o una copia delle intestazioni (forse il write_csv la funzione è 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 utilizzato qui preserva l'ordine solo in Python >3.4.Se l'ordine è importante, usa il file OrderedDict([('name', 'bob'),('age',25)]) modulo.

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 a .csv file

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top