ArcPy와 Python을 사용하여 속성 테이블에서 영어 이외의 문자를 교체 하시겠습니까?


9

일부 속성에 영어 이외의 문자 ÅÄÖ가 포함 된 모양 파일이 몇 개 있습니다. 일부 쿼리는 이러한 문자 (특히 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'. 이 문제의 원인에 대한 제안 사항이 있습니까?

답변:


7

나는 스웨덴어 (ä, ö, å)와 같은 특수 문자뿐만 아니라 포르투갈어 및 스페인어 (é, í, ú, ó 등)와 같은 다른 언어로 표현되는 특수 문자를 너무 자주 다루고 있습니다. 예를 들어, 도시의 이름이 모든 악센트가 제거 된 일반 라틴어로 작성된 데이터가 있으므로 "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 모듈 사용에 대한 자세한 내용은 링크를 참조하십시오 .


이것이 어떻게 유용한 지 알지만 문자를 그대로 유지하려면 어떻게해야합니까? 특별한 캐릭터를 유지하기 위해 마술을 할 수 있을까요?
Bogdan Mircea Stanciu 2016 년

6

ÅÄÖ에 대한 반복 작업은 쉽지 않았습니다. 유니 코드 문자열이라고하며 리터럴 ÅÄ 대신 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)

1

다음이 작동하는지 확인하십시오.

val = code(unicode(str(prow.Typkod), "utf-8")

감사! 을 할당하는 데 도움이 val되었지만 현재 행 (다음 줄)에 쓰는 데는 도움이 되지 않았습니다. [이 수정으로 질문을 업데이트합니다.]
Martin

이제이 줄이 실패했음을 의미합니다 : prow.Typkod_U = val? 같은 오류가 있습니까? 변환 후 val 값은 무엇입니까?
mapoholic

새 오류 메시지를 포함하여 몇 가지 새로운 정보를 추가했습니다.
Martin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.