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 utf8codificació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
csven 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 pandasmó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
utf8en 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
csvmódulo vanilla , debe alimentarlo OrderedDicto 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.