En Python 3 las cosas son un poco diferentes, pero mucho más simples y menos propensas a errores. Es una buena idea decirle al CSV que su archivo debe abrirse con utf8
codificación, ya que hace que los datos sean más portátiles para otros (suponiendo que no esté utilizando 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
csv
en cuenta que en python 3 necesita el newline=''
parámetro, de lo contrario, obtendrá líneas en blanco en su CSV al abrir en excel / opencalc.
Alternativamente: prefiero usar el controlador csv en el pandas
módulo. Creo que es más tolerante a los problemas de codificación, y los pandas convertirán automáticamente los números de cadena 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 por usted si le da una ruta, y se configurará de manera predeterminada
utf8
en python3, y también descubrirá los encabezados.
- un marco de datos no tiene la misma estructura que lo que le ofrece CSV, por lo que agrega una línea al cargar para obtener lo mismo:
dataframe.to_dict('records')
- pandas también hace que sea mucho más fácil controlar el orden de las columnas en su archivo csv. Por defecto, son alfabéticos, pero puede especificar el orden de las columnas. Con el
csv
módulo vanilla , debe alimentarlo OrderedDict
o aparecerán en un orden aleatorio (si trabaja en python <3.5). Ver: Preservar el orden de las columnas en Python Pandas DataFrame para más información.