일부 속성에 영어 이외의 문자 ÅÄÖ가 포함 된 모양 파일이 몇 개 있습니다. 일부 쿼리는 이러한 문자 (특히 ChangeDetector )에서 작동하지 않으므로 간단한 스크립트를 사용하여 미리 변경하고 새 문자열을 다른 필드에 추가하려고했습니다.
그러나 문자 변경은 정상적으로 작동하지만 arcpy.UpdateCursor로 필드를 업데이트하지는 않습니다.
이것을 해결하는 적절한 방법은 무엇입니까?
또한 동일한 오류로 코드 블록에 “코드”를 게시하는 동안 필드 계산기를 통해이 작업을 시도했습니다.
오류 메시지 :
런타임 오류 추적 (가장 최근 호출) : 파일 “”, 줄 1, 파일 “c : /gis/python/teststring.py”, 줄 28, val = code (str (prow.Typkod)) UnicodeEncodeError : ‘ascii’코덱은 위치 3에서 문자 u ‘\ xc4’를 인코딩 할 수 없습니다. 서 수가 범위 내에 있지 않습니다 (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Ä] 등입니다.
Windows 7에서 ArcMap Basic (10.1)을 사용합니다.
새 오류 메시지 :
런타임 오류 추적 (가장 최근 호출) : 파일 “”, 줄 1, 파일 “c : /gis/python/teststring.py”, 줄 29, val = code (unicode (str (row. Typkod), “utf-8”)) UnicodeEncodeError : ‘ascii’코덱은 위치 3에서 문자 u ‘\ xc4’를 인코딩 할 수 없습니다. 서수는 범위 내에 있지 않습니다 (128)
>>> val
‘DDRÄ’
>>> type(val)
유형 ‘str’
함수의 출력이 어떻게 든 잘못 된 것처럼 보입니다. ÅÄÖ이 관련되어있을 때 data = u'DDR\xc4'
(내 의도대로) 반환 하지 않습니다 data = 'DDRAE'
. 이 문제의 원인에 대한 제안 사항이 있습니까?
답변
나는 스웨덴어 (ä, ö, å)와 같은 특수 문자뿐만 아니라 포르투갈어 및 스페인어 (é, í, ú, ó 등)와 같은 다른 언어로 표현되는 특수 문자를 너무 자주 다루고 있습니다. 예를 들어, 도시의 이름이 모든 악센트가 제거 된 일반 라틴어로 작성된 데이터가 있으므로 “Göteborg”는 “Goteborg”가되고 “Åre”는 “Are”입니다. 조인을 수행하고 데이터를 일치 시키려면 악센트를 영어 라틴어 기반 문자로 바꿔야합니다.
나는 당신이 당신 자신의 대답에 먼저 보여준 것처럼 이것을 사용했지만,이 논리는 곧 유지하기가 다소 번거로워졌습니다. 이제 파이썬 설치 및 기능을 반복하기 위해 arcpy에서 이미 사용 가능한 unicodedata 모듈을 사용합니다.
import unicodedata
import arcpy
import os
def strip_accents(s):
return ''.join(c for c in unicodedata.normalize('NFD', s)
if unicodedata.category(c) != 'Mn')
arcpy.env.workspace = r"C:\TempData_processed.gdb"
workspace = arcpy.env.workspace
in_fc = os.path.join(workspace,"FC")
fields = ["Adm_name","Adm_Latin"]
with arcpy.da.UpdateCursor(in_fc,fields) as upd_cursor:
for row in upd_cursor:
row[1] = strip_accents(u"{0}".format(row[0]))
upd_cursor.updateRow(row)
python unicode 문자열에서 악센트를 제거하는 가장 좋은 방법은 무엇입니까? 에서 unicodedata 모듈 사용에 대한 자세한 내용은 링크를 참조하십시오 .
답변
ÅÄÖ에 대한 반복 작업은 쉽지 않았습니다. 유니 코드 문자열이라고하며 리터럴 ÅÄ 대신 if 문을 체크인 할 때 사용됩니다. 내가 알아 낸 후에 나머지는 케이크 한 조각이었습니다. 🙂
결과 코드 :
# -*- coding: cp1252 -*-
def code(infield):
data = ''
for i in infield:
## print i
if i == u'\xc4': #Ä
data = data + 'AE'
elif i == u'\xe4': #ä
data = data + 'ae'
elif i == u'\xc5': #Å
data = data + 'AA'
elif i == u'\xe5': #å
data = data + 'aa'
elif i == u'\xd6': #Ö
data = data + 'OE'
elif i == u'\xf6': #ö
data = data + 'oe'
else:
data = data + i
return data
shp = arcpy.GetParameterAsText(0)
field = arcpy.GetParameterAsText(1)
newfield = field + '_U'
arcpy.AddField_management(shp, newfield, 'TEXT')
prows = arcpy.UpdateCursor(shp)
for row in prows:
row.newfield = code(row.field)
prows.updateRow(row)
답변
다음이 작동하는지 확인하십시오.
val = code(unicode(str(prow.Typkod), "utf-8")