Expresión en arcpy.CalculateField_management
Estoy trabajando en un conjunto de herramientas y una de las entradas es un campo de un shapefile. He definido el campo y lo he usado en múltiples funciones, y está funcionando sin ningún error.
El problema es que cuando quiero usar el campo en una expresión en CalculateField, no reconoce el campo definido, pero cuando uso el nombre del campo (nombre en la tabla de atributos) funciona.
Creo que cometo un error al escribir el código de la parte de expresión.
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')
Además, tengo otra pregunta sobre cómo agregar la salida de mi conjunto de herramientas al contenido después de cada ejecución.
Cuando ejecuto mi conjunto de herramientas cada vez, la salida no aparece en el contenido, cada vez que tengo que importar la salida de la carpeta de salida.
Respuestas
Ha cometido un error básico, ha incrustado la variable que llamó fielddirectamente dentro de una expresión de texto, es decir, dentro de "", por lo que la ve como un texto, no como una variable.
Haz algo como esto:
expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')
Como nota al margen: shapes1, shapes2y unionfieldson objetos de resultado, el resultado de la ejecución de la herramienta. Le recomendaría que los llame de alguna manera, resObjya que le ayudará a comprender su código, ya que en este momento es completamente engañoso en cuanto a lo que representan.
para usar el valor de una variable en una cadena de texto, recomiendo usar .format().
en la práctica, escriba su cadena con el parámetro faltante en el medio y {}luego enumere todos los parámetros en la función de formato (separados por ,)
arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')
Al hacer eso, no olvide agregar el nombre del campo entre !!, de lo contrario, no es el valor contenido por el campo que se utilizará, sino su nombre (no creo que desee copiar el nombre del campo para todas las filas) .
Dicho esto, llenar un nuevo campo con los valores de otro campo no necesita una declaración de reemplazo compleja. Podrías usar:
arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')
Puede aplicar el mismo método a su segundo ejemplo (tenga en cuenta que los campos deben ser del mismo tipo).
arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')