Wyrażenie w arcpy.CalculateField_management

Oct 05 2020

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

7 Hornbydd Oct 05 2020 at 00:33

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ą.

4 radouxju Oct 05 2020 at 03:17

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')