Выражение в arcpy.CalculateField_management
Я работаю над набором инструментов, и одним из входных данных является поле шейп-файла. Я определил поле, использовал его в нескольких функциях, и оно работает без ошибок.
Проблема в том, что когда я хочу использовать поле в выражении в 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')