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>`
Respuestas:
El archivo en cuestión no está usando la
CP1252
codificación. Está usando otra codificación. Cuál tienes que descubrir tú mismo. Los comunes sonLatin-1
yUTF-8
. Como 0x90 en realidad no significa nadaLatin-1
,UTF-8
(donde 0x90 es un byte de continuación) es más probable.Usted especifica la codificación cuando abre el archivo:
fuente
io
módulo:io.open(filename,encoding="utf8")
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 usandofrom geotext import GeoText
. Por favor sugiera una solución.Solo para agregar en caso de
file = open(filename, encoding="utf8")
que no funcione, intentefile = open(filename, errors='ignore')
fuente
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 Text
tiene un comando para mostrar la codificación si se ha configurado ...View
->Show Console
(o Ctrl+ `)view.encoding()
y espere lo mejor (no pude obtener nada,Undefined
pero tal vez tenga mejor suerte ...)fuente
:set fileencoding
( desde este enlace )view.encoding()
.Alternativamente, si no necesita decodificar el archivo, como subir el archivo a un sitio web
open(filename, 'rb')
,. r = lectura, b = binariofuente
TLDR? Tratar:
file = open(filename, encoding='cp437)
¿Por qué? Cuando uno usa:
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:
Otra solución es usar:
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):
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).
fuente
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"
fuente
Deje de perder su tiempo, simplemente agregue lo siguiente
encoding="cp437"
yerrors='ignore'
su código tanto en lectura como en escritura:Buena suerte
fuente
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
fuente