Wyrażenie w arcpy.CalculateField_management
Pracuję nad zestawem narzędzi, a jednym z danych wejściowych jest pole shapefile. Zdefiniowałem pole i używałem go w wielu funkcjach i działa bezbłędnie.
Problem polega na tym, że gdy chcę użyć pola w wyrażeniu w CalculateField, nie rozpoznaje ono zdefiniowanego pola, ale gdy używam nazwy pola (nazwa w tabeli atrybutów) to działa.
Myślę, że popełniam błąd pisząc kod dla części wyrażenia.
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')
Mam również inne pytanie dotyczące dodawania wyników mojego zestawu narzędzi do zawartości po każdym uruchomieniu.
Kiedy uruchamiam mój zestaw narzędzi za każdym razem, dane wyjściowe nie pojawiają się w zawartości, za każdym razem, gdy muszę importować dane wyjściowe z folderu wyjściowego.
Odpowiedzi
Popełniłeś podstawowy błąd, zmienną, którą wywołałeś, osadziłeś fieldbezpośrednio w wyrażeniu tekstowym, tj. Wewnątrz "", więc widzi ją jako jakiś tekst, a nie zmienną.
Zrób coś takiego:
expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')
Na marginesie: shapes1, shapes2i unionfieldsą obiektami rezultacie wynikiem realizacji narzędzia. Poleciłbym nazwać je czymś w rodzaju, resObjponieważ pomoże ci to zrozumieć twój kod, ponieważ w tej chwili jest on całkowicie mylący co do tego, co reprezentują.
w celu wykorzystania wartości zmiennej w ciągu tekstowym polecam użyć .format().
w praktyce napisz swój ciąg z brakującym parametrem pomiędzy, {}a następnie wypisz wszystkie parametry w funkcji format (oddzielone ,)
arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')
Robiąc to, nie zapomnij dodać nazwy pola między !!, w przeciwnym razie nie jest to wartość zawarta w polu, które będzie używane, ale jego nazwa (nie sądzę, że chcesz skopiować nazwę pola dla wszystkich wierszy) .
To powiedziawszy, wypełnienie nowego pola wartościami z innego pola nie wymaga złożonej instrukcji zamiany. Możesz użyć:
arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')
Możesz zastosować tę samą metodę w drugim przykładzie (pamiętaj, że pola muszą być tego samego typu).
arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')