Expressão em arcpy.CalculateField_management

Oct 05 2020

Estou trabalhando em um conjunto de ferramentas e uma das entradas é um campo de um shapefile. Eu defini o campo e usei em várias funções, e está funcionando sem erros.

O problema é que quando eu quero usar o campo em uma expressão em CalculateField, ele não reconhece o campo definido, mas quando eu uso o nome do campo (nome na tabela de atributos) funciona.

Acho que errei ao escrever o código para a parte da expressão.

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

Além disso, tenho outra pergunta sobre como adicionar a saída do meu conjunto de ferramentas ao conteúdo após cada execução.

Quando executo meu conjunto de ferramentas todas as vezes, a saída não aparece no conteúdo, sempre que preciso importar a saída da pasta de saída.

Respostas

7 Hornbydd Oct 05 2020 at 00:33

Você cometeu um erro básico, incorporou a variável que chamou fielddiretamente em uma expressão de texto, ou seja, dentro de "", portanto, ela a vê como um texto e não como uma variável.

Faça algo assim:

expression = "!Classific!.replace(!Classific!,'" + field + "')"
shapes2=arcpy.CalculateField_management(shapes1,'Classific',expression, 'PYTHON3')

Como uma nota lateral: shapes1, shapes2e unionfieldsão objetos de resultado, o resultado da execução da ferramenta. Eu recomendo que você os chame de algo assim, resObjpois isso o ajudará a entender seu código, pois no momento ele é completamente enganoso quanto ao que eles representam.

4 radouxju Oct 05 2020 at 03:17

para usar o valor de uma variável em uma string de texto, recomendo usar .format().

na prática, escreva sua string com o parâmetro ausente no meio, em {}seguida, liste todos os parâmetros na função de formato (separados por ,)

arcpy.AddField_management(shapes,'Classific','TEXT')
arcpy.CalculateField_management(shapes,'Classific',"!Classific!.replace(!Classific!,!{0}!)".format(field), 'PYTHON3')

Fazendo isso, não se esqueça de adicionar o nome do campo entre !!, caso contrário não é o valor contido pelo campo que será usado, mas seu nome (eu não acho que você deseja copiar o nome do campo para todas as linhas) .

Dito isso, preencher um novo campo com os valores de outro campo não precisa de uma instrução de substituição complexa. Você pode usar:

arcpy.CalculateField_management(shapes,'Classific',"!{}!".format(field), 'PYTHON3')

Você pode aplicar o mesmo método ao seu segundo exemplo (observe que os campos devem ser do mesmo tipo).

arcpy.CalculateField_management(shapes,field,"!{}! + !First_class! ".format(field), 'PYTHON3')