चापलूसी में अभिव्यक्ति
मैं एक टूलसेट पर काम कर रहा हूं, और इनपुट्स में से एक शेपफाइल का एक क्षेत्र है। मैंने क्षेत्र को परिभाषित किया है और मैंने इसे कई कार्यों में उपयोग किया है, और यह बिना किसी त्रुटि के काम कर रहा है।
समस्या यह है कि जब मैं कैलकुलेटफिल्ड में एक अभिव्यक्ति में फ़ील्ड का उपयोग करना चाहता हूं, तो यह परिभाषित फ़ील्ड को नहीं पहचानता है, लेकिन जब मैं फ़ील्ड (विशेषता तालिका में नाम) का उपयोग करता हूं तो यह काम करता है।
मुझे लगता है कि मैं अभिव्यक्ति भाग के लिए कोड लिखने में गलती करता हूं।
import os, sys
import arcpy
from arcpy import env
from arcpy.sa import *
arcpy.CheckOutExtension("Spatial")
###### Define variables
shapes = sys.argv[1]
outputfolder = sys.argv[2]
outputname = sys.argv[3]
field = sys.argv[4]
output = os.path.join(outputfolder,outputname)
arcpy.AddMessage(shapes)
arcpy.AddMessage(field)
arcpy.AddMessage(output)
shapes1=arcpy.AddField_management(shapes,'Classific','TEXT')
shapes2=arcpy.CalculateField_management(shapes1,'Classific',"!Classific!.replace(!Classific!,field)", 'PYTHON3')
Unionfield = arcpy.CalculateField_management(Unionfield, field, "field+ !FIRST_Clas!", 'PYTHON3')
Unionfield = arcpy.CalculateField_management(Unionfield, field, "!Class!+ !FIRST_Clas!", 'PYTHON3')
साथ ही, मेरे पास प्रत्येक रनिंग के बाद अपने टूलसेट के आउटपुट को कंटेंट में जोड़ने के बारे में एक और सवाल है।
जब मैं हर बार अपना टूलसेट चलाता हूं, तो आउटपुट सामग्री में दिखाई नहीं देता है, हर बार मुझे आउटपुट फोल्डर से आउटपुट आयात करना पड़ता है।
जवाब
आप एक बुनियादी गलती की है, तो आप चर आप बुलाया एम्बेड है fieldसीधे अंदर एक पाठ अभिव्यक्ति, यानी भीतर "", तो यह नहीं एक चर के रूप में कुछ पाठ के रूप में देखता है।
कुछ इस तरह से करें:
expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')
एक तरफ ध्यान दें के रूप में: shapes1, shapes2और unionfieldपरिणाम वस्तुओं, उपकरण निष्पादन का परिणाम है। मैं आपको उन्हें कुछ इस तरह से कॉल करने की सलाह दूंगा resObjक्योंकि यह आपके कोड को समझने में मदद करेगा कि फिलहाल यह पूरी तरह से भ्रामक है जैसा कि वे प्रतिनिधित्व करते हैं।
एक पाठ स्ट्रिंग में एक चर के मूल्य का उपयोग करने के लिए, मैं उपयोग करने की सलाह देता हूं .format()।
व्यवहार में, बीच में लापता पैरामीटर के साथ अपनी स्ट्रिंग लिखें, {}प्रारूप फ़ंक्शन में सभी मापदंडों को सूचीबद्ध करें (द्वारा अलग किया गया ,)
arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')
ऐसा करने से, फ़ील्ड नाम को बीच में जोड़ना न भूलें !!, अन्यथा यह उस फ़ील्ड द्वारा निहित मान नहीं है जिसका उपयोग किया जाएगा, लेकिन इसका नाम (मुझे नहीं लगता है कि आप सभी पंक्तियों के लिए फ़ील्ड नाम की प्रतिलिपि बनाना चाहते हैं) ।
यह कहा जा रहा है, एक और क्षेत्र के मूल्यों के साथ एक नए क्षेत्र को भरने के लिए एक जटिल प्रतिस्थापन कथन की आवश्यकता नहीं है। आप उपयोग कर सकते हैं:
arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')
आप अपने दूसरे उदाहरण के लिए एक ही विधि लागू कर सकते हैं (ध्यान दें कि फ़ील्ड एक ही प्रकार के होने चाहिए)।
arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')