python - start - UnicodeDecodeError: el codec ''utf8'' no puede decodificar el byte 0x9c
unicodedecodeerror utf 8 codec can t decode byte 0xf3 in position 11 invalid continuation byte (7)
¿Qué puede hacer si necesita hacer un cambio en un archivo, pero no sabe la codificación del archivo? Si sabe que la codificación es compatible con ASCII y solo desea examinar o modificar las partes ASCII, puede abrir el archivo con el controlador de errores surrogateescape:
with open(fname, ''r'', encoding="ascii", errors="surrogateescape") as f:
data = f.read()
Tengo un servidor de socket que se supone que debe recibir caracteres válidos UTF-8 de los clientes.
El problema es que algunos clientes (principalmente piratas informáticos) están enviando todo tipo de datos incorrectos.
Puedo distinguir fácilmente al cliente original, pero estoy registrando en los archivos todos los datos enviados para poder analizarlos más tarde.
A veces obtengo caracteres como este, que causan el error UnicodeDecodeError
.
Necesito poder hacer la cadena UTF-8 con o sin esos caracteres.
Actualizar:
Para mi caso particular, el servicio de socket era un MTA y, por lo tanto, solo espero recibir comandos ASCII como:
EHLO example.com
MAIL FROM: <[email protected]>
...
Estaba registrando todo esto en JSON.
Luego, algunas personas sin buenas intenciones decidieron vender todo tipo de basura.
Es por eso que para mi caso específico es perfectamente correcto quitar los caracteres que no son ASCII.
Cambiar el motor de C a Python hizo el truco por mí.
El motor es C:
pd.read_csv(gdp_path, sep=''/t'', engine=''c'')
El códec ''utf-8'' no puede decodificar el byte 0x92 en la posición 18: byte de inicio no válido
El motor es Python:
pd.read_csv(gdp_path, sep=''/t'', engine=''python'')
No hay errores para mí.
En caso de que alguien tenga el mismo problema. YouCompleteMe usando vim con YouCompleteMe , no pude iniciar ycmd con este mensaje de error, lo que hice es: export LC_CTYPE="en_US.UTF-8"
, el problema desapareció.
Este tipo de problema surge para mí ahora que me mudé a Python 3. No tenía idea de que Python 2 era simplemente un problema con la codificación de archivos.
Encontré esta buena explicación de las diferencias y cómo encontrar una solución después de que nada de lo anterior funcionó para mí.
http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html
En resumen, para hacer que Python 3 se comporte de la manera más similar posible al uso de Python 2:
with open(filename, encoding="latin-1") as datafile:
# work on datafile here
Sin embargo, lea el artículo, no hay una solución única para todos.
Tuve el mismo problema con UnicodeDecodeError
y lo resolví con esta línea. No sé si es la mejor manera pero funcionó para mí.
str = str.decode(''unicode_escape'').encode(''utf-8'')
http://docs.python.org/howto/unicode.html#the-unicode-type
str = unicode(str, errors=''replace'')
o
str = unicode(str, errors=''ignore'')
Nota: esta solución eliminará (ignorará) los caracteres en cuestión que devuelven la cadena sin ellos. Solo use esto si su necesidad es despojarlos, no convertirlos.
Alternativamente, use el método abierto del módulo de codecs
para leer en el archivo:
import codecs
with codecs.open(file_name, "r",encoding=''utf-8'', errors=''ignore'') as fdata:
>>> ''/x9c''.decode(''cp1252'')
u''/u0153''
>>> print ''/x9c''.decode(''cp1252'')
œ