Tengo algunos shapefiles donde algunos de los atributos contienen los caracteres no ingleses ÅÄÖ. Dado que algunas consultas no funcionan con estos caracteres (específicamente ChangeDetector ), intenté cambiarlos por adelantado con un script simple y agregar las nuevas cadenas a otro campo.
Sin embargo, el cambio de caracteres funciona bien pero no actualiza el campo con arcpy.UpdateCursor.
¿Cuál es una forma apropiada de resolver esto?
También intenté hacer esto a través de la Calculadora de campo mientras publicaba "código" en el bloque de código, con el mismo error.
Mensaje de error:
Runtime error Traceback (última llamada reciente): Archivo "", línea 1, en el Archivo "c: /gis/python/teststring.py", línea 28, en val = code (str (prow.Typkod)) UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u '\ xc4' en la posición 3: el ordinal no está en el rango (128)
Código:
# -*- coding: cp1252 -*-
def code(infield):
data = ''
for i in infield:
## print i
if i == 'Ä':
data = data + 'AE'
elif i == 'ä':
data = data + 'ae'
elif i == 'Å':
data = data + 'AA'
elif i == 'å':
data = data + 'aa'
elif i == 'Ö':
data = data + 'OE'
elif i == 'ö':
data = data + 'oe'
else:
data = data + i
return data
shp = r'O:\XXX\250000\DB\ArcView\shape.shp'
prows = arcpy.UpdateCursor(shp)
for prow in prows:
val = code(unicode(str(prow.Typkod), "utf-8"))
prow.Typkod_U = val
print val
prows.updateRow(prow)
Los valores de Typkod son del tipo: [D, D, S, DDRÄ, TRÄ] etc.
Yo uso ArcMap Basic (10.1) en Windows 7.
Nuevo mensaje de error:
Runtime error Traceback (última llamada más reciente): Archivo "", línea 1, en el Archivo "c: /gis/python/teststring.py", línea 29, en val = code (unicode (str (fila. Typkod), "utf-8")) UnicodeEncodeError: el códec 'ascii' no puede codificar el carácter u '\ xc4' en la posición 3: el ordinal no está en el rango (128)
>>> val
'DDRÄ'
>>> type(val)
tipo 'str'
Parece que la salida de la función es incorrecta de alguna manera. Cuando hay ÅÄÖ involucrado, regresa data = u'DDR\xc4'
y no (como era mi intención) data = 'DDRAE'
. ¿Alguna sugerencia sobre lo que podría causar esto?
Resulta que iterar sobre ÅÄÖ no fue tan fácil. Se le conoce como una cadena Unicode, y cuando se registran las sentencias if que deben usarse en lugar del literal ÅÄÖ. Después de descubrirlo, el resto fue pan comido :)
Código resultante:
fuente
Vea si lo siguiente funciona:
fuente
val
, pero no para escribirlo en la fila actual (la siguiente línea). [Actualizando la pregunta con esta modificación.]