Выражение в arcpy.CalculateField_management

Oct 05 2020

Я работаю над набором инструментов, и одним из входных данных является поле шейп-файла. Я определил поле, использовал его в нескольких функциях, и оно работает без ошибок.

Проблема в том, что когда я хочу использовать поле в выражении в 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')