python - read - UnicodeDecodeError:(códec ''utf-8'') mientras lee un archivo csv
save to csv python (6)
Esta pregunta ya tiene una respuesta aquí:
Lo que estoy intentando es leer un csv para hacer un marco de datos --- hacer cambios en una columna --- nuevamente actualizar / reflejar el valor cambiado en el mismo csv (to_csv) - otra vez tratando de leer ese csv para hacer otro marco de datos ... allí recibo un error
UnicodeDecodeError: ''utf-8'' codec can''t decode byte 0xe7 in position 7: invalid continuation byte
mi código es
import pandas as pd
df = pd.read_csv("D:/ss.csv")
df.columns #o/p is Index([''CUSTOMER_MAILID'', ''False'', ''True''], dtype=''object'')
df[''True''] = df[''True''] + 2 #making changes to one column of type float
df.to_csv("D:/ss.csv") #updating that .csv
df1 = pd.read_csv("D:/ss.csv") #again trying to read that csv
UnicodeDecodeError: ''utf-8'' codec can''t decode byte 0xe7 in position 7: invalid continuation byte
Por lo tanto, sugiera cómo puedo evitar el error y poder volver a leer ese csv en un marco de datos.
Sé que en algún lugar me falta "codificar = algún tipo de códec" o "decodificar = algún tipo" mientras leo y escribo en csv.
Pero no sé exactamente qué se debe cambiar. Necesito ayuda.
Codificación conocida
Si conoce la codificación del archivo que desea leer, puede usar
pd.read_csv(''filename.txt'', encoding=''encoding'')
Estas son las posibles codificaciones: https://docs.python.org/3/library/codecs.html#standard-encodings
Codificación desconocida
Si no conoce la codificación, puede intentar usar chardet, sin embargo, no se garantiza que funcione. Es más un trabajo de adivinar.
import chardet
import pandas as pd
with open(''filename.csv'', ''rb'') as f:
result = chardet.detect(f.read()) # or readline if the file is large
pd.read_csv(''filename.csv'', encoding=result[''encoding''])
¿Ese error ocurre en la primera lectura de los datos, o en la segunda lectura después de que lo escribe y vuelve a leerlo? Supongo que en realidad está sucediendo en la primera lectura de los datos, porque tu CSV tiene una codificación que no es UTF-8.
Intente abrir ese archivo CSV en Notepad ++, o Excel, o LibreOffice. ¿Tiene su fuente de datos el carácter ç (C con cedilla)? Si lo hace, entonces ese byte 0xE7 que está viendo probablemente sea el codificado en cualquiera de Latin-1 o Windows-1252 (llamado "cp1252" en Python).
Al read_csv()
la documentación de la función Pandas read_csv()
, veo que tiene un parámetro de encoding
, que debería ser el nombre de la codificación en la que espera que esté el archivo CSV. Por lo tanto, intente agregar encoding="cp1252"
a su read_csv()
llamar, de la siguiente manera:
df = pd.read_csv(r"D:/ss.csv", encoding="cp1252")
Tenga en cuenta que agregué el carácter r
en frente del nombre del archivo, por lo que se considerará una "cadena en bruto" y las barras invertidas no se tratarán especialmente. De esta forma, no se sorprenderá cuando cambie el nombre de archivo de ss.csv
a new-ss.csv
, donde la cadena D:/new-ss.csv
se leerá como D
, :
, carácter de nueva línea, e
, w
, etc.
De todos modos, pruebe ese parámetro de codificación en su primera llamada read_csv()
y vea si funciona. (Es solo una suposición, ya que no conozco sus datos reales. Si el archivo de datos no es privado y no es demasiado grande, intente publicar el archivo de datos para que podamos ver su contenido, eso nos haría mejores que solo adivinar.)
El método anterior usado al importar y luego detectar el tipo de archivo funciona importar chardet
with open(''filename.csv'', ''rb'') as f:
result = chardet.detect(f.read()) # or readline if the file is large
pd.read_csv(''filename.csv'', encoding=result[''encoding''])
Sí, obtendrás este error. Tengo que solucionar este problema, abriendo el archivo csv en el bloc de notas ++ y cambiando la codificación a través del menú de codificación -> convertir a UTF-8. Luego guardando el archivo. Entonces nuevamente corriendo el programa de Python sobre él.
Otra solución es usar el módulo de códecs en python para la codificación-decodificación de archivos. No he usado eso.
Soy nuevo en Python. Se topó con este problema exacto cuando cambié manualmente la extensión en mi archivo Excel a .csv y traté de leerlo con read_csv. Sin embargo, si abrí el archivo Excel y lo guardé como un archivo csv, pareció funcionar.
Una solución simple es que puede abrir el archivo csv en un editor como Sublime Text y guardarlo con la codificación ''utf-8''. Entonces podemos leer el archivo fácilmente a través de pandas.