Error de encoding de Python Unicode

Estoy leyendo y analizando un archivo XML de Amazon y mientras el archivo XML muestra un ‘, cuando bash imprimirlo, aparece el siguiente error:

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

Por lo que he leído en línea hasta ahora, el error proviene del hecho de que el archivo XML está en UTF-8, pero Python quiere manejarlo como un carácter codificado ASCII. ¿Existe una forma sencilla de eliminar el error y hacer que mi progtwig imprima el XML a medida que se lee?

Probablemente, su problema es que lo analizó bien, y ahora está intentando imprimir el contenido del XML y no puede porque hay algunos caracteres Unicode extranjeros. Trate de codificar su cadena de Unicode como ascii primero:

 unicodeData.encode('ascii', 'ignore') 

La parte ‘ignorar’ le dirá que solo omita esos caracteres. De los documentos de python:

 >>> u = unichr(40960) + u'abcd' + unichr(1972) >>> u.encode('utf-8') '\xea\x80\x80abcd\xde\xb4' >>> u.encode('ascii') Traceback (most recent call last): File "", line 1, in ? UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128) >>> u.encode('ascii', 'ignore') 'abcd' >>> u.encode('ascii', 'replace') '?abcd?' >>> u.encode('ascii', 'xmlcharrefreplace') 'ꀀabcd޴' 

Es posible que desee leer este artículo: http://www.joelonsoftware.com/articles/Unicode.html , que me pareció muy útil como tutorial básico sobre lo que está sucediendo. Después de la lectura, dejará de sentir que está adivinando qué comandos usar (o al menos eso me pasó a mí).

Una mejor solución:

 if type(value) == str: # Ignore errors even if the string is not proper UTF-8 or has # broken marker bytes. # Python built-in function unicode() can do this. value = unicode(value, "utf-8", errors="ignore") else: # Assume the value object has proper __unicode__() method value = unicode(value) 

Si desea leer más sobre por qué:

http://docs.plone.org/manage/troubleshooting/unicode.html#id1

No codifique la encoding de caracteres de su entorno dentro de su script; imprimir texto Unicode directamente en su lugar:

 assert isinstance(text, unicode) # or str on Python 3 print(text) 

Si su salida se redirige a un archivo (o una tubería); podría utilizar PYTHONIOENCODING PYTHONIOENCODING, para especificar la encoding de caracteres:

 $ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8 

De lo contrario, python your_script.py debería funcionar tal como está: su configuración regional se usa para codificar el texto (en POSIX verifique: LC_ALL , LC_CTYPE , LANG envvars: establezca LANG en una configuración regional utf-8 si es necesario).

Para imprimir Unicode en Windows, vea esta respuesta que muestra cómo imprimir Unicode en la consola de Windows, en un archivo o usando IDLE .

Excelente publicación: http://www.carlosble.com/2010/12/understanding-python-and-unicode/

 # -*- coding: utf-8 -*- def __if_number_get_string(number): converted_str = number if isinstance(number, int) or \ isinstance(number, float): converted_str = str(number) return converted_str def get_unicode(strOrUnicode, encoding='utf-8'): strOrUnicode = __if_number_get_string(strOrUnicode) if isinstance(strOrUnicode, unicode): return strOrUnicode return unicode(strOrUnicode, encoding, errors='ignore') def get_string(strOrUnicode, encoding='utf-8'): strOrUnicode = __if_number_get_string(strOrUnicode) if isinstance(strOrUnicode, unicode): return strOrUnicode.encode(encoding) return strOrUnicode 

Puedes usar algo de la forma

 s.decode('utf-8') 

que convertirá un bytestring codificado en UTF-8 en una cadena Python Unicode. Pero el procedimiento exacto a utilizar depende de cómo cargue y analice exactamente el archivo XML; por ejemplo, si nunca accede directamente a la cadena XML, es posible que deba usar un objeto decodificador del módulo de codecs .

Escribí lo siguiente para corregir las citas no asciicas molestas y forzar la conversión a algo utilizable.

 unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", } def unicodeToAscii(inStr): try: return str(inStr) except: pass outStr = "" for i in inStr: try: outStr = outStr + str(i) except: if unicodeToAsciiMap.has_key(i): outStr = outStr + unicodeToAsciiMap[i] else: try: print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)" except: print "unicodeToAscii: unknown code (encoded as _)", repr(i) outStr = outStr + "_" return outStr 

Si necesita imprimir una representación aproximada de la cadena en la pantalla, en lugar de ignorar esos caracteres no imprimibles, pruebe el paquete unidecode aquí:

https://pypi.python.org/pypi/Unidecode

La explicación se encuentra aquí:

https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/

Esto es mejor que usar el u.encode('ascii', 'ignore') para una cadena u dada, y puede salvarte de un dolor de cabeza innecesario si la precisión del carácter no es lo que buscas, pero aún así quieres tener una legibilidad humana.

Wirawan

Python 3.5, 2018

Si no sabe cuál es la encoding pero el analizador de Unicode está teniendo problemas, puede abrir el archivo en Notepad++ y en la barra superior, seleccione Encoding->Convert to ANSI . Entonces puedes escribir tu python así

 with open('filepath', 'r', encoding='ANSI') as file: for word in file.read().split(): print(word) 

Intente agregar la siguiente línea en la parte superior de su script de python.

 # _*_ coding:utf-8 _*_