Eu tenho alguns shapefiles nos quais alguns dos atributos contêm os caracteres não ingleses ÅÄÖ. Como algumas consultas não funcionam com esses caracteres (especificamente ChangeDetector ), tentei alterá-los antecipadamente com um script simples e adicionar as novas strings a outro campo.
No entanto, a alteração de caracteres funciona bem, mas não atualiza o campo com arcpy.UpdateCursor.
Qual é a maneira apropriada de resolver isso?
Eu também tentei fazer isso através da calculadora de campo ao postar "código" no código de bloqueio, com o mesmo erro.
Mensagem de erro:
Erro de tempo de execução Traceback (última chamada mais recente): Arquivo "", linha 1, no arquivo "c: /gis/python/teststring.py", linha 28, em val = code (str (prow.Typkod)) UnicodeEncodeError: o codec 'ascii' não pode codificar o caractere u '\ xc4' na posição 3: ordinal fora do intervalo (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)
Os valores do Typkod são do tipo: [D, D, S, DDRÄ, TRÄ] etc.
Eu uso o ArcMap Basic (10.1) no Windows 7.
Nova mensagem de erro:
Erro de tempo de execução Traceback (última chamada mais recente): Arquivo "", linha 1, no arquivo "c: /gis/python/teststring.py", linha 29, em val = code (unicode (str (row. Typkod), "utf-8")) UnicodeEncodeError: o codec 'ascii' não pode codificar o caractere u '\ xc4' na posição 3: ordinal fora do intervalo (128)
>>> val
'DDRÄ'
>>> type(val)
type 'str'
Parece que a saída da função está errada de alguma forma. Quando há ÅÄÖ envolvido, ele retorna data = u'DDR\xc4'
e não (como era minha intenção) data = 'DDRAE'
. Alguma sugestão sobre o que pode causar isso?
Acontece que iterar sobre ÅÄÖ não foi tão fácil. É referido como uma cadeia unicode e, ao fazer o check-in das instruções if que devem ser usadas no lugar do literal ÅÄÖ. Depois que eu descobri isso, o resto foi um pedaço de bolo :)
Código resultante:
fonte
Veja se o seguinte funciona:
fonte
val
, mas não na gravação na linha atual (a linha a seguir). [Atualizando a pergunta com esta modificação.]