Pregunta

Tengo una lista de diccionarios que se ve algo como esto:

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

¿Qué debo hacer para convertir esto en un archivo csv que se ve algo como esto:

name,age,weight
bob,25,200
jim,31,180
¿Fue útil?

Solución

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: Mi solución antes no maneja el orden. Como se ha señalado por Wilduck, DictWriter es más apropiado en este caso.

Otros consejos

esto es cuando usted tiene una lista de diccionarios:

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

Debido a @user y @BiXiC pidieron ayuda con UTF-8 aquí una variación de la solución por @Matthew. (No estoy autorizado a hacer comentarios, así que estoy respondiendo.)

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 cosas son un poco diferentes, pero mucho más simple y menos propenso a errores. Es una idea buena para contar la CSV su archivo debe abrirse con utf8 codificación, ya que hace que los datos más portátil a otros (asumiendo que no están usando una codificación más restrictiva, como 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)
  • Tenga en cuenta que csv en Python 3 necesita conocer el newline='', de lo contrario se obtiene líneas en blanco en su CSV al abrir en Excel / OpenCalc.

Como alternativa: Yo prefiero el uso al controlador csv en el módulo pandas. Me parece que es más tolerante a las cuestiones que codifican, y pandas convertirá automáticamente números de cuerda en CSV en el tipo correcto (int, float, etc) al cargar el archivo.

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

Nota:

  • pandas se encargará de abrir el archivo para usted si usted le da un camino, y será por defecto utf8 en python3, y averiguar las cabeceras también.
  • una trama de datos no es la misma estructura que lo que le da CSV, por lo que se agrega una sola linea de carga para obtener la misma cosa: dataframe.to_dict('records')
  • pandas también hace que sea mucho más fácil de controlar el orden de las columnas en el archivo csv. Por defecto, son por orden alfabético, pero se puede especificar el orden de las columnas. Con el módulo de csv de vainilla, es necesario darle de comer una OrderedDict O que va a aparecer en un orden aleatorio (si se trabaja en pitón <3,5). Ver: preservar el orden de columna en Python pandas trama de datos para más

Aquí hay otra solución, más general que asumir que no tienen una lista de filas (tal vez no caben en la memoria) o una copia de los encabezados (tal vez la función write_csv es genérico):

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 : el constructor OrderedDict utilizado aquí sólo se conserva el orden en Python> 3.4. Si el orden es importante, utilice el formulario 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]])

Esta sería la forma más sencilla de datos de escritura a CSV archivo

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top