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' codec ca n't encode character u '\ xc4' in position 3:ordinal not range(128)

>>> val 「DDRÄ」
>>> type(val) タイプ「str」


関数からの出力がどういうわけか間違っているように見えます。ÅÄÖが関与している場合はdata = u'DDR\xc4'、(私の意図したように)戻り、戻りませんdata = 'DDRAE'。これを引き起こす可能性があるものについて何か提案はありますか?

回答:


7

私はスウェーデン語(ä、ö、å)などの特殊文字だけでなく、ポルトガル語やスペイン語(é、í、ú、óなど)などの他の言語で表示される特殊文字も頻繁に扱っています。たとえば、市の名前がす​​べてラテン語で書かれ、アクセントがすべて削除されたデータがあるため、「Göteborg」は「Goteborg」になり、「Åre」は「Are」になります。結合を実行してデータを一致させるには、アクセントを英語のラテン語ベースの文字に置き換える必要があります。

私はあなたが最初にあなた自身の答えで示したようにこれをしていましたが、このロジックはすぐに維持するのがかなり面倒になりました。今、私はすでにPythonのインストールで利用可能なunicodedataモジュールと、機能を繰り返すためのarcpyを使用しています。

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)

unicodedataモジュールの使用の詳細については、リンクを参照してください。Python ユニコード文字列のアクセントを削除する最良の方法は何ですか?


これがどのように役立つかはわかりますが、文字をそのままにしておく必要がある場合はどうでしょうか。それらの特殊文字を保持するために魔法をかけることができますか?
Bogdan Mircea Stanciu

6

ÅÄÖを反復するのはそれほど簡単ではないことがわかりました。これは、Unicode文字列と呼ばれ、リテラルÅinsteadの代わりに使用する必要がある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が、現在の行(次の行)への書き込みには役立ちませんでした。[この変更で質問を更新します。]
マーティン

あなたはこの行が今失敗することを意味します:prow.Typkod_U = val?同じエラーで?それで、変換後のval値は何ですか?
mapoholic 2013

新しいエラーメッセージを含む、いくつかの新しい情報を追加しました。
マーティン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.