UnicodeDecodeError: el códec 'charmap' no puede decodificar el byte X en la posición Y: los mapas de caracteres a <undefined>


550

Estoy tratando de obtener un programa de Python 3 para hacer algunas manipulaciones con un archivo de texto lleno de información. Sin embargo, cuando intento leer el archivo aparece el siguiente error:

 Traceback (most recent call last):  
     File "SCRIPT LOCATION", line NUMBER, in <module>  
     `text = file.read()`  
     File "C:\Python31\lib\encodings\cp1252.py", line 23, in decode  
     `return codecs.charmap_decode(input,self.errors,decoding_table)[0]`  
     UnicodeDecodeError: 'charmap' codec can't decode byte 0x90 in position 2907500: character maps to `<undefined>`  

2
Por el mismo error, esta solución me ha ayudado, solución de error de mapa de caracteres
Shubham Sharma

2
Consulte Procesar archivos de texto en Python 3 para comprender por qué obtiene este error.
Andreas Haferburg

Respuestas:


961

El archivo en cuestión no está usando la CP1252codificación. Está usando otra codificación. Cuál tienes que descubrir tú mismo. Los comunes son Latin-1y UTF-8. Como 0x90 en realidad no significa nada Latin-1, UTF-8(donde 0x90 es un byte de continuación) es más probable.

Usted especifica la codificación cuando abre el archivo:

file = open(filename, encoding="utf8")

19
Genial, tuve ese problema con algún código Python 2.7 que intenté ejecutar en Python 3.4. ¡Latin-1 funcionó para mí!
1vand1ng0

2
si está utilizando Python 2.7 y obtiene el mismo error, pruebe el iomódulo:io.open(filename,encoding="utf8")
christopherlovell

99
@ 1vand1ng0: por supuesto, Latin-1 funciona; funcionará para cualquier archivo independientemente de cuál sea la codificación real del archivo. Esto se debe a que los 256 valores posibles de bytes en un archivo tienen un punto de código latino-1 para asignar, ¡pero eso no significa que obtenga resultados legibles! Si no conoce la codificación, incluso abrir el archivo en modo binario podría ser mejor que asumir Latin-1.
Martijn Pieters

1
Es unicode por defecto, pero unicode no es una codificación. regebro.wordpress.com/2011/03/23/…
Lennart Regebro

1
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)incluso después de usar esto obtengo el mismo error. También he intentado con otra codificación pero todo en vano. En este código también estoy usando from geotext import GeoText. Por favor sugiera una solución.
Salah

47

Solo para agregar en caso de file = open(filename, encoding="utf8")que no funcione, intentefile = open(filename, errors='ignore')


Muchas gracias, lo intentaré. Hay algunos caracteres no válidos en partes de archivos que no me importan.
Stephen Nutt

66
Advertencia: Esto provocará la pérdida de datos cuando se encuentren caracteres desconocidos (lo que puede estar bien según su situación)
Hans Goldman

34

Como una extensión a la respuesta de @ LennartRegebro :

Si no puede saber qué codificación utiliza su archivo y la solución anterior no funciona (no lo es utf8) y se encuentra simplemente adivinando, existen herramientas en línea que puede usar para identificar qué codificación es. No son perfectos, pero generalmente funcionan bien. Después de descubrir la codificación, debería poder usar la solución anterior.

EDITAR: (copiado del comentario)

Un editor de texto bastante popular Sublime Texttiene un comando para mostrar la codificación si se ha configurado ...

  1. Vaya a View-> Show Console(o Ctrl+ `)

ingrese la descripción de la imagen aquí

  1. Escriba en el campo en la parte inferior view.encoding()y espere lo mejor (no pude obtener nada, Undefinedpero tal vez tenga mejor suerte ...)

ingrese la descripción de la imagen aquí


2
Algunos editores de texto también proporcionarán esta información. Sé que con vim puede obtener esto a través de :set fileencoding( desde este enlace )
PaxRomana99

3
Sublime Text, también: abre la consola y escribe view.encoding().
JimmidyJoo

Alternativamente, puede abrir su archivo con el bloc de notas. 'Guardar como' y verá un menú desplegable con la codificación utilizada
don_Gunner94

9

Alternativamente, si no necesita decodificar el archivo, como subir el archivo a un sitio web open(filename, 'rb'),. r = lectura, b = binario


Gracias, ese fue el caso de mi problema
shahin gh

6

TLDR? Tratar:file = open(filename, encoding='cp437)

¿Por qué? Cuando uno usa:

file = open(filename)
text = file.read()

Python asume que el archivo usa la misma página de códigos que el entorno actual (cp1252 en el caso de la publicación de apertura) e intenta decodificarlo en su propio UTF-8 predeterminado. Si el archivo contiene caracteres de valores no definidos en esta página de códigos (como 0x90) obtenemos UnicodeDecodeError. A veces no conocemos la codificación del archivo, a veces la codificación del archivo puede ser manejada por Python (como, por ejemplo, cp790), a veces el archivo puede contener codificaciones mixtas.

Si dichos caracteres no son necesarios, uno puede decidir reemplazarlos por signos de interrogación, con:

file = open(filename, errors='replace')

Otra solución es usar:

file = open(filename, errors='ignore')

Los caracteres se dejan intactos, pero también se enmascararán otros errores.

Una solución bastante buena es especificar la codificación, pero no ninguna codificación (como cp1252), sino la que tiene TODOS los caracteres definidos (como cp437):

file = open(filename, encoding='cp437')

La página de códigos 437 es la codificación original de DOS. Todos los códigos están definidos, por lo que no hay errores al leer el archivo, no se ocultan errores, los caracteres se conservan (no se dejan intactos pero aún se distinguen).


1
Wow, gracias. Esta es la única decodificación que funciona para mí.
Kowalski

1

Para aquellos que trabajan en Anaconda en Windows, tuve el mismo problema. Notepad ++ me ayuda a resolverlo.

Abra el archivo en Notepad ++. En la parte inferior derecha, le indicará la codificación del archivo actual. En el menú superior, junto a "Ver", busque "Codificación". En "Codificación", vaya a "conjuntos de caracteres" y busque con paciencia la búsqueda que necesita. En mi caso, la codificación "Windows-1252" se encontró en "Europa occidental"


1

Deje de perder su tiempo, simplemente agregue lo siguiente encoding="cp437"y errors='ignore'su código tanto en lectura como en escritura:

open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')

Buena suerte


Claro, senor. Entendido. No hay tiempo perdido. Gracias. ¿Quieres una taza de café o un buen vino?
Pramesh Bajracharya

0

para mí, cambiar la codificación de caracteres Mysql de la misma manera que mi código ayudó a resolver la solución. `photo = open ('pic3.png', codificación = latin1), texto fuerte ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.