Nitelik tablolarındaki İngilizce olmayan karakterleri ArcPy ve Python kullanarak mı değiştiriyorsunuz?


9

Bazı niteliklerin İngilizce olmayan ÅÄÖ karakterlerini içerdiği birkaç şekil dosyam var. Bazı sorgular bu karakterlerle (özellikle ChangeDetector ) çalışmadığından, bunları basit bir komut dosyasıyla önceden değiştirmeye ve yeni dizeleri başka bir alana eklemeye çalıştım.

Ancak, karakterlerde değişiklik iyi çalışır ancak alanı arcpy.UpdateCursor ile güncellemez.

Bunu çözmenin uygun bir yolu nedir?

Ben de aynı hata ile kod bloğuna "kod" gönderirken Alan Hesaplayıcı üzerinden yapmaya çalıştım.

Hata mesajı:
Çalışma zamanı hatası Geri izleme (en son çağrı son): "c: /gis/python/teststring.py" Dosyasında "", satır 1, dosya = val (kod (prow.Typkod)) UnicodeEncodeError: 'ascii' codec bileşeni 3 konumunda u '\ xc4' karakterini kodlayamıyor: sıra değeri aralıkta değil (128)

Kod:

# -*- 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 değerleri şu türdedir: [D, D, S, DDRÄ, TRÄ] vb.

Windows 7'de ArcMap Basic (10.1) kullanıyorum.


Yeni Hata iletisi:
Çalışma zamanı hatası Geri izleme (en son çağrı son olarak): "c: /gis/python/teststring.py" dosyasında "satır", satır 1, val = kod (unicode (str (satır). Typkod), "utf-8")) UnicodeEncodeError: 'ascii' codec bileşeni 3 konumunda u '\ xc4' karakterini kodlayamıyor: aralıklı aralıkta değil (128)

>>> val 'DDRÄ'
>>> type(val) tür 'str'


İşlevden çıktı bir şekilde yanlış gibi görünüyor. ÅÄÖ dahil edildiğinde geri döner data = u'DDR\xc4've niyetim gibi değil data = 'DDRAE'. Buna neyin sebep olabileceğine dair herhangi bir öneriniz var mı?

Yanıtlar:


7

İsveççe (ä, ö, å) gibi özel karakterlerle çok sık uğraşıyorum, aynı zamanda Portekizce ve İspanyolca gibi diğer dillerde de (é, í, ú, ó vb.) Örneğin, şehir adının tüm aksanların kaldırıldığı düz Latince yazıldığı verilerim var, bu yüzden "Göteborg" "Göteborg" ve "Åre" "Are". Birleştirmeleri gerçekleştirmek ve verileri eşleştirmek için aksanları İngilizce Latin tabanlı karakterle değiştirmem gerekiyor.

Bunu ilk önce kendi cevabınızda gösterdiğiniz gibi yapardım, ama bu mantık kısa sürede sürdürmek için oldukça zahmetli hale geldi. Şimdi özellikleri yinelemek için Python kurulumu ve arcpy ile zaten mevcut olan unicodedata modülünü kullanıyorum.

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)

Bir python unicode dizesindeki aksanları kaldırmanın en iyi yolu nedir? Adresindeki unicodedata modülünü kullanma hakkında daha fazla bilgi için bağlantıya bakın.


Bunun nasıl faydalı olabileceğini görüyorum, ama ya karakterleri olduğu gibi tutmamız gerekirse? bu özel karakterleri korumak için biraz sihir yapabilir miyiz?
Bogdan Mircea Stanciu

6

ÅÄÖ üzerinde yineleme yapmak o kadar kolay değildi. Unicode dize olarak ve ÅÄÖ değişmezi yerine kullanılması gereken if ifadelerini kontrol ederken ifade edilir. Bunu anladıktan sonra, gerisi çok kolaydı :)

Sonuç kodu:

# -*- 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

Aşağıdakilerin işe yarayıp yaramadığına bakın:

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

Teşekkürler! Bu, atanmasına yardımcı oldu val, ancak geçerli satıra (aşağıdaki satıra) yazmak için yardımcı olmadı . [Bu değişiklikle soru güncelleniyor.]
Martin

Bu satırın şimdi başarısız olduğunu mu söylüyorsunuz: prow.Typkod_U = val? Aynı hatayla mı? Peki, dönüşümden sonraki val değeri nedir?
mapoholic

Yeni hata mesajı da dahil olmak üzere bazı yeni bilgiler ekledim.
Martin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.