Suite

Itération des calculs de champ dans arcpy

Itération des calculs de champ dans arcpy


J'ai réussi à ajouter plusieurs champs, mais j'ai eu du mal à exécuter plusieurs calculs de champs en boucle. Maintenant, ce que je veux, c'est parcourir ces champs existants répertoriés dansmulti_champsvariable et remplissez les valeurs dans les champs nouvellement créés via lediv_fieldsvariable. J'espérais que quelque chose comme ce qui suit fonctionnerait, plutôt que d'utiliser des curseurs de recherche.

import arcpy from arcpy import env # définir les environnements arcpy.env.overwriteOutput = True env.workspace = "C:WORKSPACEmm_agallocation.gdb" inFeature = "myFeature" div_fields = ("divpa_whea" , "divpa_maiz", " divpa_barl", "divpa_sorg", "divpa_sorg", "divpa_grou","divaa_whea", "divaa_maiz", "divaa_barl", "divaa_sorg", "divaa_sorg", "divaa_grou") pour i dans div_fields : arcpy.AddField_management(myFeeld_management i, "DOUBLE", "", "", "", "", "NULLABLE") mult_fields = ("mpa_whea" , "mpa_maiz", "mpa_barl", "mpa_sorg", "mpa_sorg", "mpa_grou"," maa_whea","maa_maiz", "maa_barl", "maa_sorg", "maa_sorg", "maa_grou") # tous les noms de champs donnés dans 'mult_fields' sont déjà dans "myFeature" pour i dans div_fields : pour k dans mult_fields : expression = "!k! * !k!" arcpy.CalculateField_management(inFeature, i, expression, "PYTHON")

J'obtiens cependant l'erreur suivante. J'imagine que c'est la façon dont je spécifie leexpressioncela me donne l'erreur.

Traceback (appel le plus récent en dernier) : Fichier "", ligne 6, dans  Fichier "C:Program Files (x86)ArcGISDesktop10.0arcpyarcpymanagement.py", ligne 2727, dans CalculateField raise e ExecuteError: ERROR 000539: Invalid field mult_fields Failed to execute (CalculateField)

Dans l'état actuel des choses, votre imbriquéepourles boucles font quelque chose comme ça :

div_fields = ["f1", "f2", "f3"] mult_fields = ["g1", "g2", "g3"] pour t,i dans enumerate(div_fields) : pour k dans mult_fields : print("{} Champ de calcul {} avec {}".format("	"*t, i, "'!{0}! * !{0}!'".format(k))) >>> Champ de calcul f1 avec ' !g1! * !g1!' Calcul du champ f1 avec '!g2! * !g2!' Calcul du champ f1 avec '!g3! * !g3!' Calcul du champ f2 avec '!g1! * !g1!' Calcul du champ f2 avec '!g2! * !g2!' Calcul du champ f2 avec '!g3! * !g3!' Calcul du champ f3 avec '!g1! * !g1!' Calcul du champ f3 avec '!g2! * !g2!' Calcul du champ f3 avec '!g3! * !g3!'

C'est Probablement pas ce que vous voulez (après tout, chacun des 12 champs est écrasé 12 fois - vous appelezCalculer le champ144 fois !). Je suppose que vous voulez que vos champs de blé soient calculés avec du blé, du sorgho avec du sorgho, etc. Pour résoudre ce problème, utilisez Zip *: français():

pour t,(i,k) dans enumerate(zip(div_fields, mult_fields)): print("{}Calcing field {} with {}".format("	"*t, i, "'!{0} ! * !{0}!'".format(k))) >>> Calcul du champ f1 avec '!g1! * !g1!' Calcul du champ f2 avec '!g2! * !g2!' Calcul du champ f3 avec '!g3! * !g3!'

Comme @Paulo l'a souligné, vous codez en dur votrekvariable, ce qui signifie queCalculer le champtente de trouver un champ nommék. Vous n'avez pas besoin de l'entourer de guillemets, alors le voici avec vos données maintenant :

pour i,k dans zip(div_fields, mult_fields): arcpy.CalculateField_management(inFeature, i, "!{0}! * !{0}!".format(k), "PYTHON_9.3") # ou "!{ }! ** 2".format(k)

En guise de conseil, vous trouverez probablement plus simple à utiliser si vous utilisez des noms de variables plus descriptifs. réserveje,j,kpour les compteurs. Puisque votre liste est nomméediv_fields, itérer dessus avecpour div_field dans div_fieldsou similaire.


je pense que tu veux changerexpression = "!k! * !k!"à

expression = "'!" + k + "! * !" + k + "!'"