У меня есть несколько шейп-файлов, где некоторые атрибуты содержат неанглийские символы ÅÄÖ. Поскольку некоторые запросы не работают с этими символами (в частности, ChangeDetector ), я попытался заранее изменить их с помощью простого сценария и добавить новые строки в другое поле.
Однако изменение символов работает нормально, но не обновляет поле с помощью arcpy.UpdateCursor.
Как правильно решить эту проблему?
Я также попытался сделать это с помощью Калькулятора полей, отправляя «код» в кодовый блок, с той же ошибкой.
Сообщение об ошибке:
Ошибка во время выполнения (последний вызов был последним): файл "", строка 1, в файле "c: /gis/python/teststring.py", строка 28, в val = code (str (prow.Typkod)) UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xc4' в позиции 3: порядковый номер не в диапазоне (128)
Код:
# -*- 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)
Значения Typkod имеют тип: [D, D, S, DDRÄ, TRÄ] и т. Д.
Я использую ArcMap Basic (10.1) в Windows 7.
Новое сообщение об ошибке: Ошибка
времени выполнения Traceback (последний вызов был последним): файл "", строка 1, в файле "c: /gis/python/teststring.py", строка 29, в val = код (unicode (str (строка. Типкод), "utf-8")) UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xc4' в позиции 3: порядковый номер не в диапазоне (128)
>>> val
'DDRÄ'
>>> type(val)
тип 'str'
Похоже, что выход из функции как-то не так. Когда вовлечено ÅÄÖ, оно возвращается, data = u'DDR\xc4'
а не (как было в моем намерении) data = 'DDRAE'
. Любые предложения о том, что может вызвать это?
Оказывается, перебирая ÅÄÖ, было не так просто. Он называется строкой Юникода и при проверке в операторах if, которые должны использоваться вместо литерала ÅÄÖ. После того, как я понял это, остальное было просто пирогом :)
Результирующий код:
источник
Посмотрите, работает ли следующее:
источник
val
, но не записать его в текущую строку (следующая строка). [Обновление вопроса с помощью этой модификации.]