นิพจน์ใน arcpy.CalculateField_management
ฉันกำลังทำงานกับชุดเครื่องมือและหนึ่งในอินพุตคือฟิลด์ของ shapefile ฉันได้กำหนดฟิลด์และฉันได้ใช้มันในหลายฟังก์ชันและทำงานได้โดยไม่มีข้อผิดพลาดใด ๆ
ปัญหาคือเมื่อฉันต้องการใช้ฟิลด์ในนิพจน์ใน CalculateField มันไม่รู้จักฟิลด์ที่กำหนด แต่เมื่อฉันใช้ชื่อฟิลด์ (ชื่อในตารางแอตทริบิวต์) มันใช้งานได้
ฉันคิดว่าฉันผิดพลาดในการเขียนโค้ดสำหรับส่วนนิพจน์
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')