ArcPy और Python का उपयोग करके गैर-अंग्रेज़ी वर्णों को विशेषता तालिकाओं में बदलना?


9

मेरे पास कुछ शेपफाइल्स हैं, जिनमें से कुछ विशेषताओं में गैर-अंग्रेजी वर्ण हैं। चूंकि कुछ प्रश्न इन वर्णों (विशेष रूप से चेंजडेक्टर ) के साथ काम नहीं करते हैं , मैंने उन्हें एक साधारण स्क्रिप्ट के साथ अग्रिम में बदलने और नए तार को दूसरे क्षेत्र में जोड़ने का प्रयास किया।

हालाँकि, वर्णों में परिवर्तन ठीक काम करता है लेकिन आर्कपी के साथ फ़ील्ड को अपडेट नहीं कर रहा है। UpdateCursor।

इसे हल करने का एक उपयुक्त तरीका क्या है?

मैंने भी कोडक को "कोड" पोस्ट कोडक के माध्यम से करने की कोशिश की है, कोडब्लॉक को उसी त्रुटि के साथ।

त्रुटि संदेश:
रनटाइम त्रुटि ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "", पंक्ति 1, फ़ाइल में "c: /gis/python/teststring.py", पंक्ति 28, वैल = कोड में (str (prow .ypkod)) यूनिकोडेनाकोड: '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)

टाइपकोड के मूल्य इस प्रकार के हैं: [डी, डी, एस, डीडीआरod, टीआरओ] आदि।

मैं विंडोज 7 पर आर्कमैप बेसिक (10.1) का उपयोग करता हूं।


नई त्रुटि संदेश:
रनटाइम त्रुटि ट्रैसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "", पंक्ति 1, फ़ाइल में "c: /gis/python/teststring.py", पंक्ति 29, में वैल = कोड (यूनिकोड (स्ट्रै (पंक्ति))। टाइपकॉड), "यूटीएफ -8")) यूनिकोडएकोडकोड: 'एससीआईआई' कोडक चरित्र 3 में स्थिति u '\ xc4' को एनकोड नहीं कर सकता: क्रम में नहीं (128)

>>> val 'DDR type'
>>> type(val) प्रकार 'str'


ऐसा प्रतीत होता है जैसे फ़ंक्शन से आउटपुट किसी तरह गलत है। जब इसमें intention शामिल होता है तो यह रिटर्न करता है data = u'DDR\xc4'और नहीं (जैसा कि मेरा इरादा था) data = 'DDRAE'। क्या इस कारण हो सकता है पर कोई सुझाव?

जवाबों:


7

मैं बहुत बार विशेष पात्रों के साथ काम कर रहा हूं, जैसे कि आपके पास स्वीडिश (ä, ö, å) है, लेकिन कुछ अन्य लोग जैसे पुर्तगाली और स्पेनिश (é, ú, ó आदि) अन्य भाषाओं में प्रस्तुत कर रहे हैं। उदाहरण के लिए, मेरे पास डेटा है जहां शहर का नाम हटाए गए सभी उच्चारणों के साथ सादे लैटिन में लिखा गया है, इसलिए "गोटेबोर्ग" "गोटेबोर्ग" और "एरे" "आर" हैं। जॉइन करने के लिए और डेटा को मैच करने के लिए मुझे एक्सेंट को इंग्लिश लैटिन-आधारित कैरेक्टर में बदलना होगा।

जैसा कि आपने पहले अपने जवाब में दिखाया है, मैं ऐसा करता था, लेकिन यह तर्क जल्द ही बनाए रखने के लिए बोझिल हो गया। अब मैं यूनिकोडेटा मॉड्यूल का उपयोग करता हूं जो पहले से ही पायथन इंस्टॉलेशन के साथ उपलब्ध है और सुविधाओं को प्रदर्शित करने के लिए आर्कपी है।

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)

एक यूनिकोडेटा मॉड्यूल का उपयोग करने के बारे में अधिक जानकारी के लिए लिंक देखें पायथन यूनिकोड स्ट्रिंग में लहजे को हटाने का सबसे अच्छा तरीका क्या है?


मैं देखता हूं कि यह कैसे उपयोगी हो सकता है, लेकिन क्या होगा यदि हमें पात्रों को रखने की आवश्यकता है? क्या हम उन विशेष पात्रों को रखने के लिए कुछ जादू कर सकते थे?
बोगडान मिर्चेया स्टैनियु

6

यह आसान नहीं था पर पुनरावृत्ति कर देता है। इसे यूनिकोड स्ट्रिंग के रूप में संदर्भित किया जाता है, और जब शाब्दिक of के बजाय उपयोग किए जाने वाले इफ-स्टेटमेंट में जाँच की जाती है। के बाद मुझे पता चला कि बाकी केक का एक टुकड़ा था :)

परिणाम कोड:

# -*- 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, लेकिन इसे वर्तमान पंक्ति (निम्न पंक्ति) में लिखने के लिए नहीं। [इस संशोधन के साथ सवाल को अद्यतन करना।]
मार्टिन 10

आपका मतलब है कि यह रेखा अब विफल हो रही है: prow.Typkod_U = val? उसी त्रुटि के साथ? तो रूपांतरण के बाद वैल वैल्यू क्या है?
मेपोहोलिक

मैंने कुछ नई जानकारी जोड़ी, जिसमें नई त्रुटि संदेश शामिल है।
मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.