Mam kilka plików kształtów, w których niektóre atrybuty zawierają znaki inne niż angielskie ÅĘÖ. Ponieważ niektóre zapytania nie działają z tymi znakami (szczególnie ChangeDetector ), próbowałem je wcześniej zmienić za pomocą prostego skryptu i dodać nowe ciągi znaków do innego pola.
Jednak zmiana znaków działa dobrze, ale nie aktualizuje pola za pomocą arcpy.UpdateCursor.
Jaki jest odpowiedni sposób rozwiązania tego?
Próbowałem to zrobić również za pomocą Kalkulatora pola, umieszczając „kod” w bloku kodu, z tym samym błędem.
Komunikat o błędzie:
Błąd w czasie wykonywania Traceback (ostatnie ostatnie połączenie): Plik „”, wiersz 1, w pliku „c: /gis/python/teststring.py”, wiersz 28, w val = kod (str (prow.Typkod)) UnicodeEncodeError: Kodek „ascii” nie może zakodować znaku u '\ xc4' na pozycji 3: porządek poza zakresem (128)
Kod:
# -*- 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)
Wartości Typkod są typu: [D, D, S, DDRĘ, TRĘ] itd.
Korzystam z ArcMap Basic (10.1) w systemie Windows 7.
Nowy komunikat o błędzie:
Błąd w czasie wykonywania Traceback (ostatnie ostatnie połączenie): Plik „”, wiersz 1, w pliku „c: /gis/python/teststring.py”, wiersz 29, w val = kod (Unicode (str (wiersz. Typkod), „utf-8”)) UnicodeEncodeError: kodek „ascii” nie może zakodować znaku u '\ xc4' w pozycji 3: numer porządkowy poza zakresem (128)
>>> val
„DDRĘ”
>>> type(val)
type ”str”
Wygląda na to, że dane wyjściowe z funkcji są jakoś niepoprawne. Kiedy jest zaangażowany ÅĘÖ, wraca data = u'DDR\xc4'
i nie (tak jak to zamierzałem) data = 'DDRAE'
. Wszelkie sugestie dotyczące tego, co może to powodować?
źródło
Okazuje się, że iteracja nad ÅĘÖ nie była taka łatwa. Jest to określane jako ciąg znaków Unicode i podczas sprawdzania instrukcji if, które muszą być użyte zamiast literału ÅĘÖ. Po tym, jak się zorientowałem, reszta to bułka z masłem :)
Wynikowy kod:
źródło
Sprawdź, czy następujące działania:
źródło
val
, ale nie w zapisaniu go do bieżącego wiersza (następnej linii). [Aktualizacja pytania o tę modyfikację.]