Espressione in arcpy.CalculateField_management
Sto lavorando su un set di strumenti e uno degli input è un campo di uno shapefile. Ho definito il campo e l'ho utilizzato in più funzioni, e funziona senza errori.
Il problema è che quando voglio usare il campo in un'espressione in CalculateField, non riconosce il campo definito, ma quando uso il nome del campo (nome nella tabella degli attributi) funziona.
Penso di aver sbagliato a scrivere il codice per la parte dell'espressione.
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')
Inoltre, ho un'altra domanda sull'aggiunta dell'output del mio set di strumenti ai contenuti dopo ogni esecuzione.
Quando eseguo il mio set di strumenti ogni volta, l'output non viene visualizzato nei contenuti, ogni volta che devo importare l'output dalla cartella di output.
Risposte
Hai commesso un errore di base, hai incorporato la variabile che hai chiamato fielddirettamente all'interno di un'espressione di testo, cioè all'interno di "", quindi la vede come un testo non come una variabile.
Fai qualcosa di simile:
expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')
Come nota laterale: shapes1, shapes2e unionfieldsono oggetti risultato, il risultato dell'esecuzione dell'utensile. Ti consiglierei di chiamarli qualcosa di simile resObjin quanto ti aiuterà a capire il tuo codice poiché al momento è completamente fuorviante su ciò che rappresentano.
per utilizzare il valore di una variabile in una stringa di testo, consiglio di utilizzare .format().
in pratica, scrivi la tua stringa con il parametro mancante tra {}quindi elenca tutti i parametri nella funzione di formattazione (separati da ,)
arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')
In questo modo, non dimenticare di aggiungere il nome del campo tra !!, altrimenti non è il valore contenuto nel campo che verrà utilizzato, ma il suo nome (non penso che tu voglia copiare il nome del campo per tutte le righe) .
Detto questo, riempire un nuovo campo con i valori di un altro campo non necessita di un'istruzione di sostituzione complessa. Potresti usare:
arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')
Puoi applicare lo stesso metodo al secondo esempio (nota che i campi devono essere dello stesso tipo).
arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')