¿Cómo puedo convertir esta lista de diccionarios en un archivo CSV?
-
28-09-2019 - |
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
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 elnewline=''
, 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 unaOrderedDict
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 ??em>: 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