librerias - lista de modulos de python
¿Hay una función de biblioteca Python que intente adivinar la codificación de caracteres de algunos bytes? (4)
La mejor manera de hacer esto que he encontrado es iterativamente intentar decodificar un prospecto con cada una de las codificaciones más comunes dentro de un bloque de prueba excepto.
Esta pregunta ya tiene una respuesta aquí:
- Determinar la codificación del texto en Python 8 respuestas
Estoy escribiendo un software de procesamiento de correo en Python que encuentra bytes extraños en los campos del encabezado. Sospecho que esto es solo correo mal formado; el mensaje mismo dice ser nosotros-ascii, así que no creo que haya una codificación verdadera, pero me gustaría obtener una cadena unicode que se aproxime a la original sin lanzar un UnicodeDecodeError
.
Por lo tanto, estoy buscando una función que requiera un str
y, opcionalmente, algunos consejos, y hace todo lo posible para devolverme un unicode
. Podría escribir uno por supuesto, pero si tal función existe, probablemente su autor haya pensado un poco más sobre la mejor manera de hacerlo.
También sé que el diseño de Python prefiere explícito a implícito y que la biblioteca estándar está diseñada para evitar la magia implícita en la decodificación de texto. Solo quiero decir explícitamente "adelante y adivine".
Por lo que puedo decir, la biblioteca estándar no tiene una función, aunque no es demasiado difícil escribir una como se sugirió anteriormente. Creo que lo real que estaba buscando era una forma de decodificar una cadena y garantizar que no arrojaría una excepción. El parámetro de errores para string.decode hace eso.
def decode(s, encodings=(''ascii'', ''utf8'', ''latin1'')):
for encoding in encodings:
try:
return s.decode(encoding)
except UnicodeDecodeError:
pass
return s.decode(''ascii'', ''ignore'')
Puede que le interese el Detector de Codificación Universal .
+1 para el módulo chardet (sugerido por @insin
).
No está en la biblioteca estándar, pero puede instalarlo fácilmente con el siguiente comando:
$ pip install chardet
Ejemplo :
>>> import chardet
>>> import urllib
>>> detect = lambda url: chardet.detect(urllib.urlopen(url).read())
>>> detect(''http://.com'')
{''confidence'': 0.85663169917190185, ''encoding'': ''ISO-8859-2''}
>>> detect(''https://.com/questions/269060/is-there-a-python-lib'')
{''confidence'': 0.98999999999999999, ''encoding'': ''utf-8''}
Consulte Instalación de Pip si no tiene uno.