2012-05-07 18 views
16

Sigo recibiendo este error mientras leo un archivo de texto. ¿Es posible manejar/ignorarlo y continuar?Tratamiento de errores Unicode con readlines de Python 3()

UnicodeEncodeError: ‘charmap’ codec can’t decode byte 0x81 in position 7827: character maps to undefined.

+1

Esto varía un _lot_ según los detalles. Python 2? Python 3? ¿Estás intentando descifrar cadenas que ya leíste? ¿Cómo? Etc. –

+0

Python 3. Estoy usando readlines() – Bob

+0

Okay: actualicé la pregunta para especificar Python 3. Unicode es uno de los lugares donde hay grandes diferencias entre 2 y 3; por favor asegúrese de especificar la versión explícitamente en el futuro. –

Respuesta

30

En Python 3, pasar a un valor apropiado errors= (como errors=ignore o errors=replace) en la creación de su objeto de archivo (suponiendo que sea una subclase de io.TextIOWrapper - y si no es así, considere envolverlo en uno!); Además, considere aprobar una codificación más probable que charmap (cuando no esté seguro, utf-8 siempre es un buen lugar para comenzar).

Por ejemplo:

f = open('misc-notes.txt', encoding='utf-8', errors='ignore') 

En Python 2, la operación read() simplemente devuelve bytes; el truco, entonces, es decodificarlos para meterlos en una cadena (si lo hace, de hecho, quiere caracteres en oposición a los bytes). Si usted no tiene una mejor conjetura para su codificación real:

your_string.decode('utf-8', 'replace') 

... para reemplazar caracteres no controlada, o

your_string.decode('utf-8', 'ignore') 

simplemente ignorarlos.

Dicho esto, sería preferible encontrar y usar su codificación real (en lugar de adivinar utf-8).

+0

Minit nitpick: en Python 2, el truco es * decodificar * ellos, no la codificación. Pero lo sabes, porque estás llamando al método 'decode'. –

+0

@ThomasK gracias, corregido. –

+0

No del todo: "el truco, entonces, es codificarlos ..." –

-1

Yeah..you podría envolverlo en un

try: 
    .... 
except UnicodeEncodeError: 
    pass 
+0

acaba de capturar UnicodeEncodeError – cobie

+2

sí, pero eso no ayuda mucho en términos de explicar cómo proceder con la lectura del resto del archivo. –

1

Debe abrir el archivo con un códec para asegurarse de que el archivo se interprete como UTF8.

 
import codecs 
fd = codecs.open(filename,'r',encoding='utf-8') 
data = fd.read() 
Cuestiones relacionadas