Suite

Changement de nom de champ en boucle dans ArcPy ?


Je dois modifier tous les noms de champs via plusieurs classes d'entités. J'ai une assez bonne idée des outils à utiliser, mais je ne sais pas comment les boucler à travers chaque classe d'entités et chaque champ. Ceci sera complété sur un fichier gdb. Je l'ai essayé de différentes manières et j'obtiens généralement une erreur de paramètre non valide sur l'outil de modification de champ.

arcpy.env.workspace = r'C:UsersDesktopGeodatabase.gdb' arcpy.env.overwriteOutput = True fcList = arcpy.ListFeatureClasses() pour fc dans fcList : fieldList = arcpy.ListFields(fc) pour le champ dans fieldList : arcpy.AlterField_management(fc, field, field.name.upper(), "")

Le seul problème que je vois avec votre code est que vous transmettez l'objet champ à l'outil AlterField, pas le nom du champ. De plus, pour info, même si cela n'a pas d'importance, vous n'avez pas besoin de passer d'arguments facultatifs vides aux fonctions python. Changer pour :

arcpy.AlterField_management(fc, field.name, field.name.upper())

Alternativement, étant donné que les outils utilisent généralement le nom d'un champ comme entrée, il est souvent plus utile de créer une liste de noms de champ, pas d'objets de champ. C'est facile à faire avec la compréhension de liste :

fieldList = [f.name pour f dans arcpy.ListFields(fc)] pour le champ dans fieldList : arcpy.AlterField_management(fc, field, field.upper())

Un peu plus d'infos : Cela devrait vous aider à comprendre ce que je veux dire quand je dis "objet de champ". Lorsque vous utilisez ListFields, la liste que vous obtenez est pleine de champs, comme expliqué dans cette documentation. Chacun de ces objets champ possède un certain nombre de propriétés, auxquelles vous accédez en les référençant comme ceci : field.propertyname. La compréhension de la liste ci-dessus pourrait être interprétée comme ceci : "Cette nouvelle liste contiendra la propriété .name de tous les objets (Fdans ce cas) qui sont renvoyés par la fonction ListFields", si cela a du sens. Ou, une version de code plus longue de la même opération pourrait ressembler à ceci :

fieldList = [] #créer une liste vide pour f dans arcpy.ListFields(fc): #parcourir tous les objets de champ fieldList.append(f.name) #ajouter la propriété name de chaque objet à la liste

Enfin, veuillez consulter la réponse de @DWynne.


En plus de mettre à jour pour utilisernom de domaine, vous avez un deuxième problème. La simple mise en majuscule du nom du champ ne fonctionnera pas non plus. L'outil se terminera mais ne mettra pas à jour le champ car la base de données ne verra pas la différence entre MyField et MYFIELD, et votre nom de champ restera tel qu'il était.

Si vous avez vraiment besoin de simplement mettre le nom du champ en majuscule, vous devrez d'abord le changer en quelque chose de différent comme étape intermédiaire.

fieldList = [f.name pour f dans arcpy.ListFields(fc)] pour le champ dans fieldList : arcpy.AlterField_management(fc, field, 'tempfieldname') arcpy.AlterField_management(fc, 'tempfieldname', field.upper())


Voir la vidéo: Create Sequential Numbers in ArcGIS without using = FID!! Bangla - বল (Octobre 2021).