UnicodeDecodeError al leer un archivo CSV en Pandas con Python

Estoy ejecutando un programa que procesa 30,000 archivos similares. Un número aleatorio de ellos se detiene y produce este error...

File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
     data = pd.read_csv(filepath, names=fields)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
     return _read(filepath_or_buffer, kwds)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
     return parser.read()
   File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
     ret = self._engine.read(nrows)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
     data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid    continuation byte

La fuente/creación de estos archivos proviene del mismo lugar. ¿Cuál es la mejor manera de corregir esto para continuar con la importación?

preguntado el 11 de agosto de 13 a las 13:08

Agregar este argumento funcionó para mí: encoding_errors='ignore' -

Ignorar los errores debería ser tu último recurso desesperado. De manera similar, adivinar aleatoriamente qué codificación usar puede eliminar el error superficialmente, pero producir basura total en los resultados. Si es nuevo en la codificación de texto, tal vez comience su próxima aventura con el desbordamiento de pila character-encoding página de información de etiqueta -

25 Respuestas

read_csv toma un encoding Opción para tratar archivos en diferentes formatos. Yo uso principalmente read_csv('file', encoding = "ISO-8859-1"), o alternativamente encoding = "utf-8" para leer, y en general utf-8 en to_csv.

También puede utilizar uno de varios alias opciones como 'latin' or 'cp1252' (Windows) en lugar de 'ISO-8859-1' (consulta: documentos de Python, también para muchas otras codificaciones que puede encontrar).

Ver documentación relevante de Pandas, ejemplos de documentos de python en archivos csv, y muchas preguntas relacionadas aquí en SO. Un buen recurso de fondo es Lo que todo desarrollador debe saber sobre Unicode y conjuntos de caracteres.

Para detectar la codificación (suponiendo que el archivo contiene caracteres que no son ascii), puede usar enca (consulta: página man) o file -i (linux) o file -I (osx) (ver página man).

Respondido 18 Feb 22, 20:02

ISO-8859-1 tiene la propiedad única entre las codificaciones de Python de que puede leer absolutamente cualquier dato binario sin arrojar un error. Muy a menudo, los principiantes probarán diferentes codificaciones sin mirar realmente los datos resultantes, y luego se preguntarán por qué sus resultados son basura cuando eligieron la incorrecta. - triples

@tripleee no hay "codificaciones de Python" (a menos que cuente cosas como implementar ROT-13 como una "codificación" en el sistema de Python); ISO-8859-1 es un estándar reconocido internacionalmente (de ahí ISO) implementado innumerables veces en innumerables entornos. Diez de las dieciséis codificaciones ISO-8859 pueden manejar binarios arbitrarios, al igual que varias páginas de códigos históricas de DOS, codificaciones de texto heredadas de Macintosh y algunas otras. ISO-8859-1 Sin embargo, tiene la propiedad (necesariamente) única de que asigna esos bytes a los primeros 256 puntos de código Unicode en orden. - Carlos Knechtel

Claro, quise decir entre las codificaciones de caracteres que admite Python. - triples

La más simple de todas las soluciones:

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

Solución alternativa:

Texto sublime:

  • Abra el archivo csv en Editor de texto sublime or Código VS.
  • Guarde el archivo en formato utf-8.
  • En sublime, haga clic en Archivo -> Guardar con codificación -> UTF-8

Código VS:

En la barra inferior de VSCode, verá la etiqueta UTF-8. Pinchalo. Se abre una ventana emergente. Haga clic en Guardar con codificación. Ahora puede elegir una nueva codificación para ese archivo.

Entonces, podrías leer tu archivo como de costumbre:

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')

y los otros tipos de codificación diferentes son:

encoding = "cp1252"
encoding = "ISO-8859-1"

Respondido 22 ago 22, 09:08

Pandas permite especificar la codificación, pero no permite ignorar los errores para no reemplazar automáticamente los bytes ofensivos. entonces no hay una talla para todos pero de diferentes maneras dependiendo del caso de uso real.

  1. Conoce la codificación y no hay ningún error de codificación en el archivo. Genial: solo tienes que especificar la codificación:

    file_encoding = 'cp1252'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
    
  2. No desea molestarse con la codificación de preguntas, y solo desea que se cargue ese maldito archivo, sin importar si algunos campos de texto contienen basura. Ok, solo tienes que usar Latin1 codificación porque acepta cualquier byte posible como entrada (y lo convierte al carácter Unicode del mismo código):

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
    
  3. Sabe que la mayor parte del archivo está escrito con una codificación específica, pero también contiene errores de codificación. Un ejemplo del mundo real es un archivo UTF8 que ha sido editado con un editor que no es utf8 y que contiene algunas líneas con una codificación diferente. Pandas no prevé un procesamiento de errores especial, pero Python open función tiene (asumiendo Python3), y read_csv acepta un archivo como objeto. Los parámetros de errores típicos que se utilizan aquí son 'ignore' que simplemente suprime los bytes ofensivos o (en mi humilde opinión, mejor) 'backslashreplace' que reemplaza los bytes ofensivos por la secuencia de escape con barra invertida de Python:

    file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
    pd.read_csv(input_fd, ...)
    

Respondido 09 ago 18, 10:08

with open('filename.csv') as f:
   print(f)

después de ejecutar este código, encontrará la codificación de 'filename.csv' y luego ejecute el código de la siguiente manera

data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"

ahí tienes

Respondido el 15 de diciembre de 18 a las 13:12

Este es un enfoque de guión más general para la pregunta indicada.

import pandas as pd

encoding_list = ['ascii', 'big5', 'big5hkscs', 'cp037', 'cp273', 'cp424', 'cp437', 'cp500', 'cp720', 'cp737'
                 , 'cp775', 'cp850', 'cp852', 'cp855', 'cp856', 'cp857', 'cp858', 'cp860', 'cp861', 'cp862'
                 , 'cp863', 'cp864', 'cp865', 'cp866', 'cp869', 'cp874', 'cp875', 'cp932', 'cp949', 'cp950'
                 , 'cp1006', 'cp1026', 'cp1125', 'cp1140', 'cp1250', 'cp1251', 'cp1252', 'cp1253', 'cp1254'
                 , 'cp1255', 'cp1256', 'cp1257', 'cp1258', 'euc_jp', 'euc_jis_2004', 'euc_jisx0213', 'euc_kr'
                 , 'gb2312', 'gbk', 'gb18030', 'hz', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2'
                 , 'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', 'iso2022_kr', 'latin_1', 'iso8859_2'
                 , 'iso8859_3', 'iso8859_4', 'iso8859_5', 'iso8859_6', 'iso8859_7', 'iso8859_8', 'iso8859_9'
                 , 'iso8859_10', 'iso8859_11', 'iso8859_13', 'iso8859_14', 'iso8859_15', 'iso8859_16', 'johab'
                 , 'koi8_r', 'koi8_t', 'koi8_u', 'kz1048', 'mac_cyrillic', 'mac_greek', 'mac_iceland', 'mac_latin2'
                 , 'mac_roman', 'mac_turkish', 'ptcp154', 'shift_jis', 'shift_jis_2004', 'shift_jisx0213', 'utf_32'
                 , 'utf_32_be', 'utf_32_le', 'utf_16', 'utf_16_be', 'utf_16_le', 'utf_7', 'utf_8', 'utf_8_sig']

for encoding in encoding_list:
    worked = True
    try:
        df = pd.read_csv(path, encoding=encoding, nrows=5)
    except:
        worked = False
    if worked:
        print(encoding, ':\n', df.head())

Uno comienza con todas las codificaciones estándar disponibles para la versión de python (en este caso 3.7 Codificaciones estándar de Python 3.7). Aquí se proporciona una lista de python utilizable de las codificaciones estándar para las diferentes versiones de python: Respuesta útil de desbordamiento de pila

Probar cada codificación en una pequeña parte de los datos; solo imprimiendo la codificación de trabajo. La salida es directamente obvia. Esta salida también aborda el problema de que una codificación como 'latin1' que se ejecuta con algún error, no necesariamente produce el resultado deseado.

En caso de la pregunta, probaría este enfoque específico para problemas CSV y luego tal vez intente usar la codificación de trabajo encontrada para todos los demás.

Respondido 05 Feb 21, 15:02

Por favor intente agregar

import pandas as pd
df = pd.read_csv('file.csv', encoding='unicode_escape')

Esto ayudará. Trabajó para mi. Además, asegúrese de estar usando el delimitador y los nombres de columna correctos.

Puede comenzar cargando solo 1000 filas para cargar el archivo rápidamente.

Respondido 25 Feb 22, 19:02

Prueba a cambiar la codificación. En mi caso, encoding = "utf-16" trabajado.

df = pd.read_csv("file.csv",encoding='utf-16')

Respondido 09 Jul 20, 07:07

En mi caso, un archivo tiene USC-2 LE BOM codificación, según Notepad++. Es encoding="utf_16_le" para Python.

Espero que ayude a encontrar una respuesta un poco más rápido para alguien.

Respondido el 09 de enero de 20 a las 05:01

Intente especificar el motor = 'python'. Funcionó para mí, pero todavía estoy tratando de averiguar por qué.

df = pd.read_csv(input_file_path,...engine='python')

Respondido el 31 de enero de 19 a las 02:01

Esto también funcionó para mí. También lo hizo la codificación = "ISO-8859-1". Definitivamente es un problema de codificación. Si un carácter especial está codificado en ANSI, como un carácter de elipse (es decir, "..."), e intenta leerlo en UTF-8, es posible que obtenga un error. La conclusión es que debe conocer la codificación con la que se creó el archivo. - Sean McCarthy

"Codificado en ANSI" no está bien definido. El término ANSI en Windows es un nombre inapropiado y no nombra ninguna codificación específica; más bien, selecciona una codificación definida en otra parte en la configuración del sistema. - triples

En mi caso esto funcionó para python 2.7:

data = read_csv(filename, encoding = "ISO-8859-1", dtype={'name_of_colum': unicode}, low_memory=False) 

Y para python 3, solo:

data = read_csv(filename, encoding = "ISO-8859-1", low_memory=False) 

Respondido 26 Jul 19, 16:07

Luché con esto por un tiempo y pensé en publicar esta pregunta ya que es el primer resultado de búsqueda. Agregando el encoding="iso-8859-1" etiqueta a los pandas read_csv no funcionó, ni ninguna otra codificación, siguió dando un UnicodeDecodeError.

Si está pasando un identificador de archivo a pd.read_csv(), necesitas poner el encoding atributo en el archivo abierto, no en read_csv. Obvio en retrospectiva, pero un error sutil para rastrear.

Respondido el 19 de Septiembre de 19 a las 08:09

Estoy publicando una respuesta para proporcionar una solución actualizada y una explicación de por qué puede ocurrir este problema. Digamos que está obteniendo estos datos de una base de datos o un libro de Excel. Si tiene caracteres especiales como La Cañada Flintridge city, bueno, a menos que esté exportando los datos usando UTF-8 codificación, vas a introducir errores. La Cañada Flintridge city se convertirá La Ca\xf1ada Flintridge city. Si estas usando pandas.read_csv sin ningún ajuste a los parámetros predeterminados, obtendrá el siguiente error

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 5: invalid continuation byte

Afortunadamente, hay algunas soluciones.

Opción 1, arregla la exportación. Asegúrese de usar UTF-8 codificación

Opción 2, si solucionar el problema de exportación no está disponible para usted y necesita usar pandas.read_csv, asegúrese de incluir los siguientes parámetros, engine='python'. Por defecto, pandas usa engine='C' lo cual es excelente para leer archivos grandes y limpios, pero fallará si surge algo inesperado. En mi experiencia, establecer encoding='utf-8' nunca ha arreglado esto UnicodeDecodeError. Además, no es necesario utilizar errors_bad_lines, sin embargo, esa sigue siendo una opción si REALMENTE necesitan.

pd.read_csv(<your file>, engine='python')

Opción 3 La solución es mi solución preferida personalmente. Lea el archivo usando Vanilla Python.

import pandas as pd

data = []

with open(<your file>, "rb") as myfile:
    # read the header seperately
    # decode it as 'utf-8', remove any special characters, and split it on the comma (or deliminator)
    header = myfile.readline().decode('utf-8').replace('\r\n', '').split(',')
    # read the rest of the data
    for line in myfile:
        row = line.decode('utf-8', errors='ignore').replace('\r\n', '').split(',')
        data.append(row)

# save the data as a dataframe
df = pd.DataFrame(data=data, columns = header)

Espero que esto ayude a las personas que se encuentran con este problema por primera vez.

Respondido el 09 de enero de 20 a las 03:01

La solución correcta en este caso sería establecer la codificación correcta. Basado en un solo carácter, es difícil decir con autoridad, pero 0xF1 corresponde a ñ en, por ejemplo, Latin-1. tripleee.github.io/8bit/#f1 tiene una lista de qué carácter representa este byte en todas las codificaciones de 8 bits compatibles con Python. errors="ignore" es una idea sumamente mala si le importa la integridad de sus datos. - triples

@tripleee buen punto, pero esa es una solución que no siempre está disponible. A veces, se le proporciona un conjunto de datos con mucho que decir sobre cómo se exporta: Jon

No veo cómo tu comentario es relevante. Si puede exportar el archivo en una codificación conocida, entonces, por supuesto, no necesita averiguar la codificación. Si recibe un archivo con una codificación desconocida, averiguar en qué codificación se encuentra es mucho más preferible que adivinar a ciegas o eliminar brutalmente cualquier dato que no sea UTF-8. Esto aún asume que el archivo no está dañado o algo así, en cuyo caso deberá encontrar y corregir la corrupción manualmente. adición a los averiguando la codificación correcta. - triples

Otro problema importante al que me enfrenté y que resultó en el mismo error fue:

_values = pd.read_csv("C:\Users\Mujeeb\Desktop\file.xlxs")

^Esta línea resultó en el mismo error porque estoy leyendo un archivo de Excel usando read_csv() método. Usar read_excel() para leer .xlxs

Respondido el 20 de junio de 20 a las 10:06

Wow, todos los demás están hablando de problemas de codificación. Parece que mi problema era peculiar. - Ishaque Mujeeb

Puedes probar esto.

import csv
import pandas as pd
df = pd.read_csv(filepath,encoding='unicode_escape')

Respondido el 14 de junio de 20 a las 10:06

Tengo problemas para abrir un archivo CSV en chino simplificado descargado de un banco en línea, lo he intentado latin1, Yo he tratado iso-8859-1, Yo he tratado cp1252, todo fue en vano.

Pero pd.read_csv("",encoding ='gbk') simplemente hace el trabajo.

respondido 03 nov., 19:06

Ninguna de las codificaciones que probó tiene soporte para representar texto chino. GBK sigue siendo moderadamente popular en China, donde es un estándar nacional, pero no se usa mucho en ningún otro lugar. Ver también en.wikipedia.org/wiki/GBK_(codificación_de_caracteres) - triples

Siempre puede intentar detectar primero la codificación del archivo, con chardet or cchardet or charset-normalizer:

from pathlib import Path
import chardet

filename = "file_name.csv"
detected = chardet.detect(Path(filename).read_bytes())
# detected is something like {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}

encoding = detected.get("encoding")
assert encoding, "Unable to detect encoding, is it a binary file?"

df = pd.read_csv(filename, encoding=encoding)

respondido 10 nov., 22:02

Esta respuesta parece ser el comodín para los problemas de codificación de CSV. Si tiene un problema de codificación extraño con su encabezado como este:

>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])

Luego, tiene un carácter de marca de orden de bytes (BOM) al comienzo de su archivo CSV. Esta respuesta aborda el problema:

Python read csv - BOM incrustado en la primera clave

La solución es cargar el CSV con encoding="utf-8-sig":

>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])

Ojalá esto ayude a alguien.

Respondido el 17 de diciembre de 18 a las 18:12

Estoy publicando una actualización de este viejo hilo. Encontré una solución que funcionó, pero requiere abrir cada archivo. Abrí mi archivo csv en LibreOffice, elegí Guardar como> editar configuración de filtro. En el menú desplegable, elegí la codificación UTF8. Luego agregué encoding="utf-8-sig" En el correo electrónico “Su Cuenta de Usuario en su Nuevo Sistema XNUMXCX”. data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig").

Espero que esto ayude a alguien.

Respondido el 01 de enero de 19 a las 01:01

Nisse, gracias por la edición. ¿Puedes explicar qué cambiaste? No veo la diferencia. - camisetadr1

No soy Nisse, pero agregó un punto y una nueva línea antes del final "Espero que esto ayude". - triples

Estoy usando Jupyter-notebook. Y en mi caso, estaba mostrando el archivo en el formato incorrecto. La opción de 'codificación' no funcionaba. Así que guardo el csv en formato utf-8 y funciona.

contestado el 13 de mayo de 19 a las 01:05

Prueba esto:

import pandas as pd
with open('filename.csv') as f:
    data = pd.read_csv(f)

Parece que se encargará de la codificación sin expresarla explícitamente a través de un argumento

Respondido 08 Oct 19, 05:10

No estoy seguro de por qué esto es diferente de simplemente usar data = pd.read_csv(f) pero efectivamente funciona. - Fjurg

Verifique la codificación antes de pasar a pandas. Te retrasará, pero...

with open(path, 'r') as f:
    encoding = f.encoding 

df = pd.read_csv(path,sep=sep, encoding=encoding)

En Python 3.7

Respondido 11 Oct 19, 15:10

Esto simplemente fallará antes si Python no puede adivinar la codificación. En Python 3 moderno en plataformas que no son de Windows, esto se establecerá de forma predeterminada en UTF-8 y fallará si el archivo no es compatible. En Windows, esto será predeterminado a lo que sea que el sistema esté configurado de manera predeterminada, por lo que podría funcionar si tiene suerte, o producir basura si tiene menos suerte. - triples

A veces, el problema es solo con el archivo .csv. El archivo puede estar dañado. Cuando se enfrenta a este problema. 'Guardar como' el archivo como csv nuevamente.

0. Open the xls/csv file
1. Go to -> files 
2. Click -> Save As 
3. Write the file name 
4. Choose 'file type' as -> CSV [very important]
5. Click -> Ok 

Respondido 04 Oct 20, 08:10

No estoy seguro de qué programa usas aquí. ¿Sobresalir? - Arpad Horvath -- Слава Україні

abrir archivo excel - Om Rastogui

Esto supone que el CSV se generó a partir de un archivo de Excel, lo que obviamente a menudo no es el caso (y si lo es, tal vez debería examinar críticamente sus opciones de herramientas). - triples

Tiene razón, pero independientemente de la herramienta utilizada para crear el archivo CSV, MS Excel tiene soporte para abrir archivos CSV, por lo tanto, puede usarlo. Además, la mayoría de las veces los archivos CSV son generados únicamente por la herramienta de Excel. Si esto no funciona, puede intentar usar alguna otra herramienta fuente. - Om Rastogui

En mi caso, no pude superar este problema utilizando ningún método proporcionado anteriormente. Cambiar el tipo de codificador a utf-8, utf-16, iso-8859-1, o cualquier otro tipo de alguna manera no funcionó.

Pero en lugar de usar pd.read_csv(filename, delimiter=';'), Solía;

pd.read_csv(open(filename, 'r'), delimiter=';')

y las cosas parecen funcionar bien.

Respondido el 28 de diciembre de 21 a las 08:12

Puedes probar con:

df = pd.read_csv('./file_name.csv', encoding='gbk')

Respondido 07 Jul 20, 10:07

Pandas no reemplaza automáticamente los bytes ofensivos cambiando el estilo de codificación. En mi caso, cambiando el parámetro de codificación de encoding = "utf-8" a encoding = "utf-16" resolvió el problema

contestado el 26 de mayo de 21 a las 21:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.