นิพจน์ใน arcpy.CalculateField_management

Oct 05 2020

ฉันกำลังทำงานกับชุดเครื่องมือและหนึ่งในอินพุตคือฟิลด์ของ 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')

นอกจากนี้ฉันมีคำถามอื่นเกี่ยวกับการเพิ่มผลลัพธ์ของชุดเครื่องมือของฉันไปยังเนื้อหาหลังจากการรันแต่ละครั้ง

เมื่อฉันเรียกใช้ชุดเครื่องมือของฉันทุกครั้งผลลัพธ์จะไม่ปรากฏในเนื้อหาทุกครั้งที่ฉันต้องนำเข้าผลลัพธ์จากโฟลเดอร์เอาท์พุท

คำตอบ

7 Hornbydd Oct 05 2020 at 00:33

คุณได้ทำผิดพลาดเบื้องต้นคุณได้ฝังตัวแปรที่คุณเรียกไว้fieldโดยตรงภายในนิพจน์ข้อความเช่นภายใน "" ดังนั้นจึงเห็นว่าเป็นข้อความบางส่วนไม่ใช่ตัวแปร

ทำสิ่งนี้:

expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')

ขณะที่ทราบด้าน: shapes1, shapes2และunionfieldเป็นวัตถุผลให้ผลการดำเนินเครื่องมือ ฉันอยากจะแนะนำให้คุณเรียกสิ่งเหล่านี้resObjว่ามันจะช่วยให้คุณเข้าใจรหัสของคุณในขณะนี้มันทำให้เข้าใจผิดอย่างสิ้นเชิงว่าเป็นตัวแทนของอะไร

4 radouxju Oct 05 2020 at 03:17

.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')