3 votos

¿cómo resolver UnicodeDecodeError en arcpy?

Necesito actualizar la fuente de datos del elemento de imagen del elemento de diseño de un mapdocument. pero está mostrando error de decodificación Unicode. mxd= arcpy.mapping.MapDocument("CURRENT") for elm in arcpy.mapping.ListLayoutElements(mxd,"PICTURE_ELEMENT"): oldname = elm.name ... if elm.name==oldname: ... elm.name=oldname.replace(r"ä","ae") ... print elm.name

después de ejecutar el código obtengo el siguiente mensaje de error:

R Traceback (última llamada más reciente): File "", line 4, in UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)

2voto

Aissen Puntos 131

No soy un experto cuando se trata de caracteres unicode, pero parece que necesitas hacer el reemplazo usando la representación unicode del carácter "ä":

elm.name=oldname.replace(u"\xe4","ae")

2voto

Alex Tereshenkov Puntos 13433

Yo mismo trabajo a menudo con caracteres Unicode debido a los diferentes idiomas utilizados para el almacenamiento de atributos en los conjuntos de datos SIG que manejo. Una de las técnicas que he aprendido en relación con Unicode es que a veces resulta útil sustituir los caracteres Unicode por el carácter latino más cercano. Esto es especialmente útil cuando se tienen dos fuentes de datos y en una aparece "Café" y en otra "Cafe". Esto funciona bien en la mayoría de los casos. símbolos diacríticos con los que también he trabajado.

Seguro que puedes correr replace sobre cadenas, pero en caso de que necesites automatizar este proceso y no quieras acabar creando un diccionario donde claves=símbolos de origen (ä) y valores=los símbolos de destino (ae), puedes utilizar esta función.

import unicodedata

def strip_accents(s):
   return ''.join(c for c in unicodedata.normalize('NFD', s)
                  if unicodedata.category(c) != 'Mn')

str_input = u'\xe4' #your input string you get
print strip_accents(str_input)

Más información de ayuda sobre Unicode en Python.

1voto

StuartLC Puntos 133

Prefiero usar utf-8 en todo el script, codificando las cadenas donde sea necesario.

oldname = elm.name.encode('utf-8')
...
elm.name=oldname.replace(r"ä".encode('utf-8'),"ae".encode('utf-8'))

También es útil declarar la codificación en la parte superior de cada script.

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

Consulte el enlace de Alex a la página de Python Unicode para obtener más información.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X