UnicodeDecodeError al leer un archivo CSV en Pandas con Python

Estoy ejecutando un progtwig que está procesando 30,000 archivos similares. Un número aleatorio de ellos están parando y produciendo 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 provienen todos del mismo lugar. ¿Cuál es la mejor manera de corregir esto para continuar con la importación?

read_csv toma una opción de encoding para tratar con archivos en diferentes formatos. Utilizo principalmente read_csv('file', encoding = "ISO-8859-1") , o alternativamente encoding = "utf-8" para leer, y generalmente utf-8 para to_csv .

También puede usar una de varias opciones de alias como 'latin' lugar de 'ISO-8859-1' (vea la documentación de Python , también para muchas otras codificaciones que pueda encontrar).

Consulte la documentación relevante de Pandas , los ejemplos de documentos de Python en archivos csv y muchas preguntas relacionadas aquí en SO.

Para detectar la encoding (suponiendo que el archivo contenga caracteres no ascii), puede usar enca (ver página de manual ) o file -i (linux) o file -I (osx) (ver página de manual ).

La más simple de todas las soluciones:

  • Abra el archivo csv en el editor de texto sublime .
  • Guarde el archivo en formato utf-8.

En sublime, haga clic en Archivo -> Guardar con encoding -> UTF-8

Luego, puedes leer tu archivo como siempre:

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

EDITAR 1:

Si hay muchos archivos, puede omitir el paso sublime.

Solo lee el archivo usando

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

y los otros tipos de encoding diferentes son:

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

Pandas permite especificar la encoding, pero no permite ignorar errores para no reemplazar automáticamente los bytes ofensivos. Por lo tanto, no existe un método que se adapte a todos los tamaños , sino a formas diferentes según el caso de uso real.

  1. Usted conoce la encoding y no hay ningún error de encoding en el archivo. Genial: solo tienes que especificar la encoding:

     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 quiere que le molesten las preguntas de encoding, y solo desea que se cargue ese maldito archivo, sin importar si algunos campos de texto contienen basura. Ok, solo tiene que usar la encoding Latin1 porque acepta cualquier byte posible como entrada (y lo convierte en el carácter Unicode del mismo código):

     pd.read_csv(input_file_and_path, ..., encoding='latin1') 
  3. Usted sabe que la mayoría del archivo está escrito con una encoding específica, pero también contiene errores de encoding. Un ejemplo del mundo real es un archivo UTF8 que se ha editado con un editor que no es utf8 y que contiene algunas líneas con una encoding diferente. Pandas no tiene provisiones para un procesamiento de error especial, pero open función de open Python tiene (asumiendo que es Python3), y read_csv acepta un archivo como objeto. Los parámetros de errores típicos que se usan aquí son 'ignore' que solo suprime los bytes ofensivos o (IMHO mejor) 'backslashreplace' que reemplaza los bytes ofensivos por la secuencia de escape de su 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, ...) 
 with open('filename.csv') as f: print(f) 

después de ejecutar este código, encontrará la encoding de ‘filename.csv’ y luego ejecute el siguiente código

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

hay que ir

Luché con esto por un tiempo y pensé que publicaría esta pregunta ya que es el primer resultado de búsqueda. La adición de la etiqueta encoding = ‘iso-8859-1 “a pandas read_csv no funcionó, ni tampoco ninguna otra encoding, siguió dando un UnicodeDecodeError.

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

Esta respuesta parece ser el catch-all para los problemas de encoding CSV. Si tiene un problema de encoding 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 lee csv – BOM incrustada 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'), ... ]) 

Esperemos que esto ayude a alguien.

En mi caso, un archivo tiene encoding “USC-2 LE BOM”, según Notepad ++. Es encoding = “utf_16_le” para python.

Esperanza, ayuda a encontrar una respuesta un poco más rápido para alguien.

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 encoding UTF8. Luego agregué encoding="utf-8-sig" a los data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig") .

Espero que esto ayude a alguien.

Intenta 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')