Expression dans arcpy.CalculateField_management

Oct 05 2020

Je travaille sur un ensemble d'outils, et l'une des entrées est un champ d'un fichier de formes. J'ai défini le champ et je l'ai utilisé dans plusieurs fonctions, et il fonctionne sans aucune erreur.

Le problème est que lorsque je veux utiliser le champ dans une expression dans CalculateField, il ne reconnaît pas le champ défini, mais lorsque j'utilise le nom du champ (nom dans la table attributaire), cela fonctionne.

Je pense que je me trompe en écrivant le code de la partie expression.

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

De plus, j'ai une autre question sur l'ajout de la sortie de mon ensemble d'outils au contenu après chaque exécution.

Lorsque j'exécute mon ensemble d'outils à chaque fois, la sortie n'apparaît pas dans le contenu, chaque fois que je dois importer la sortie de outputfolder.

Réponses

7 Hornbydd Oct 05 2020 at 00:33

Vous avez fait une erreur de base, vous avez incorporé la variable que vous avez appelée fielddirectement dans une expression de texte, c'est-à-dire dans le "", donc il la voit comme du texte et non comme une variable.

Faites quelque chose comme ceci:

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

Comme une note de côté: shapes1, shapes2et unionfieldsont des objets, le résultat RESULTAT de l'exécution de l' outil. Je vous recommanderais de les appeler quelque chose comme resObjcela vous aidera à comprendre votre code car pour le moment, il est complètement trompeur quant à ce qu'ils représentent.

4 radouxju Oct 05 2020 at 03:17

afin d'utiliser la valeur d'une variable dans une chaîne de texte, je recommande d'utiliser .format().

en pratique, écrivez votre chaîne avec le paramètre manquant entre les deux {}puis listez tous les paramètres dans la fonction de format (séparés par ,)

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

Pour ce faire, n'oubliez pas d'ajouter le nom du champ entre !!, sinon ce n'est pas la valeur contenue par le champ qui sera utilisé, mais son nom (je ne pense pas que vous voulez copier le nom du champ pour toutes les lignes) .

Cela étant dit, le remplissage d'un nouveau champ avec les valeurs d'un autre champ n'a pas besoin d'une instruction de remplacement complexe. Vous pouvez utiliser:

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

Vous pouvez appliquer la même méthode à votre deuxième exemple (notez que les champs doivent être du même type).

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