Saya memiliki beberapa shapefile di mana beberapa atribut berisi karakter non-Inggris ÅÄÖ. Karena beberapa kueri tidak berfungsi dengan karakter ini (khususnya ChangeDetector ), saya mencoba mengubahnya terlebih dahulu dengan skrip sederhana dan menambahkan string baru ke bidang lain.
Namun, perubahan karakter berfungsi dengan baik tetapi tidak memperbarui bidang dengan arcpy.UpdateCursor.
Apa cara yang tepat untuk menyelesaikan ini?
Saya juga mencoba melakukan ini melalui Field Calculator sambil memposting "kode" ke kode kunci, dengan kesalahan yang sama.
Pesan kesalahan:
Runtime error Traceback (panggilan terakhir terakhir): File "", line 1, dalam File "c: /gis/python/teststring.py", baris 28, dalam val = kode (str (prow.Typkod)) UnicodeEncodeError: 'ascii' codec tidak dapat menyandikan karakter u '\ xc4' di posisi 3: ordinal tidak dalam jangkauan (128)
Kode:
# -*- 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)
Nilai-nilai Typkod adalah dari jenis: [D, D, S, DDRÄ, TRÄ] dll.
Saya menggunakan ArcMap Basic (10.1) pada Windows 7.
Pesan Kesalahan Baru:
Kesalahan runtime Traceback (panggilan terakhir terakhir): File "", baris 1, dalam File "c: /gis/python/teststring.py", baris 29, dalam val = kode (unicode (str (baris. Typkod), "utf-8")) UnicodeEncodeError: codec 'ascii' tidak dapat menyandikan karakter u '\ xc4' di posisi 3: ordinal tidak dalam jangkauan (128)
>>> val
'DDRÄ'
>>> type(val)
ketik 'str'
Tampaknya seolah-olah output dari fungsi tersebut salah. Ketika ada ÅÄÖ yang terlibat, ia kembali data = u'DDR\xc4'
dan tidak (seperti niat saya) data = 'DDRAE'
. Ada saran tentang apa yang menyebabkan ini?
Ternyata iterasi lebih dari ÅÄÖ tidak mudah. Ini disebut sebagai string unicode, dan ketika memeriksa pernyataan if yang harus digunakan alih-alih ÅÄÖ literal. Setelah saya mengetahuinya, sisanya adalah sepotong kue :)
Kode yang dihasilkan:
sumber
Lihat apakah yang berikut ini berfungsi:
sumber
val
, tetapi tidak untuk menulisnya ke baris saat ini (baris berikut). [Memperbarui pertanyaan dengan modifikasi ini.]