Biểu thức trong arcpy.CalculateField_management
Tôi đang làm việc trên một bộ công cụ và một trong những đầu vào là một trường của tệp hình dạng. Tôi đã xác định trường và tôi đã sử dụng nó trong nhiều chức năng và nó đang hoạt động mà không có bất kỳ lỗi nào.
Vấn đề là khi tôi muốn sử dụng trường trong một biểu thức trong CalculField, nó không nhận ra trường được xác định, nhưng khi tôi sử dụng tên trường (tên trong bảng thuộc tính) thì nó hoạt động.
Tôi nghĩ rằng tôi đã mắc lỗi khi viết mã cho phần biểu thức.
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')
Ngoài ra, tôi có một câu hỏi khác về việc thêm đầu ra của bộ công cụ của tôi vào nội dung sau mỗi lần chạy.
Khi tôi chạy bộ công cụ của mình mỗi lần, đầu ra không xuất hiện trong nội dung, mỗi lần tôi phải nhập kết quả từ thư mục đầu ra.
Trả lời
Bạn đã mắc phải một sai lầm cơ bản, bạn đã nhúng fieldtrực tiếp biến mà bạn gọi vào trong một biểu thức văn bản, tức là trong "", vì vậy nó coi nó là một số văn bản không phải là một biến.
Làm điều gì đó như sau:
expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')
Là một mặt lưu ý: shapes1, shapes2và unionfieldlà đối tượng KẾT QUẢ, kết quả của việc thực hiện công cụ. Tôi khuyên bạn nên gọi chúng như thế nào resObjvì nó sẽ giúp bạn hiểu mã của mình tại thời điểm hiện tại, nó hoàn toàn gây hiểu nhầm về những gì chúng đại diện.
để sử dụng giá trị của một biến trong chuỗi văn bản, tôi khuyên bạn nên sử dụng .format().
trong thực tế, hãy viết chuỗi của bạn với tham số bị thiếu ở giữa {}sau đó liệt kê tất cả các tham số trong hàm định dạng (phân tách bằng ,)
arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')
Làm điều đó, đừng quên thêm tên trường vào giữa !!, nếu không, nó không phải là giá trị được chứa bởi trường sẽ được sử dụng, mà là tên của nó (Tôi không nghĩ rằng bạn muốn sao chép tên trường cho tất cả các hàng) .
Điều đó đang được nói, điền vào một trường mới với các giá trị của trường khác không cần một câu lệnh thay thế phức tạp. Bạn đã có thể sử dụng:
arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')
Bạn có thể áp dụng phương pháp tương tự cho ví dụ thứ hai của mình (lưu ý rằng các trường phải cùng loại).
arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')