Renommer un champ à l'aide d'ArcPy?


9

Ce que je dois faire:

  1. renommer un nom de champ d'une table / classe d'entités
  2. copier toutes les valeurs dans le nouveau champ

Jusqu'à présent, j'ai fait le code suivant comme le suggère @ artwork21:

import sys
import traceback
import arcpy
from arcpy import env

## ARGUMENTS
# argv[1] = input table/feature class path
# argv[2] = input old field name
# argv[3] = input new field name  

path = sys.argv[1]
oldFieldName = sys.argv[2] 
newFieldName = sys.argv[3] 

env.overwriteOutput = True

fields = arcpy.ListFields(path)
for field in fields:
    if field.aliasName == oldFieldName:
        if not oldFieldName == newFieldName:
            fieldType = field.type
            # Add new field
            arcpy.AddField_management(path, newFieldName, fieldType)
            #Calculates the new field based on old field values
            arcpy.CalculateField_management(path, newFieldName, "!"+oldFieldName+"!", "PYTHON", "")
            # Delete the old field (if necessary)
            arcpy.DeleteField_management(path, oldFieldName)

Comment mapper field.typeau AddField_managementtype de champ de la méthode? Et tandis que le champ est au milieu, le champ est supprimé du milieu et ajouté au dernier. Cela ne ressemble pas à un nom de champ renommé.

Y a-t-il une meilleure solution qui m'aide à faire ces choses?


Votre champ de couche d'entités n'est pas renommé ici, fieldInfo.setNewName (index, "stat"). C'est pourquoi vous obtenez votre erreur sur la ligne row.setValue ("stat", gValue).
artwork21

2
setNewName (index, new_field_name), doit être utilisé uniquement pour définir de nouveaux noms de champ, pas pour renommer ceux existants.
artwork21

2
Un objet FieldInfo ne fait rien aux données sous-jacentes, c'est simplement une représentation des propriétés du champ qui peut être utilisée comme entrée pour certains outils de création de nouvelles données, semblable à un objet FieldMappings.
blah238

1
Est-ce old_fieldun nom de variable ou le nom réel de l'ancien champ? S'il s'agit d'un nom de variable, vous devez utiliser le formatage de chaîne ou la concaténation pour encapsuler la valeur de la variable avec les crochets (analyseur VB) ou les points d'exclamation (analyseur Python).
blah238

1
Un alias en général est un "surnom" ou un pseudonyme . Il n'est pas nécessairement égal au nom de colonne réel dans la base de données.
blah238

Réponses:


15

Essayez ceci en utilisant une combinaison d'outils Ajouter un champ, Calculer un champ et Supprimer un champ arcpy:

if fieldInfo.getFieldName(index) == "status":
    arcpy.AddField_management(layer, "stat", "TEXT", "", "", "50", "",        "NULLABLE", "NON_REQUIRED", "")                     
    arcpy.CalculateField_management(layer, "stat", "!status!", "PYTHON_9.3", "")
    arcpy.DeleteField_management(layer, "status")

1
Je veux que les deux types de champs soient identiques. mais les noms field_type des méthodes field.Type et AddField_management ne sont pas identiques. Que faire?
Emi

@Emi, je ne comprends pas ce que vous entendez par "deux champs de même type"? Vous souhaitez que la valeur de "status" soit placée dans un nouveau champ appelé "stat"?
artwork21

oui je veux que la valeur dans "status", mette dans le nouveau champ appelé "stat"
Emi

J'ai également essayé fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")au lieu de fieldInfo.setNewName(index, "stat"). Mais la même erreur s'est produite avec mon code.
Emi

Pour row = arcpy.UpdateCursor (inputFeatureClass), essayez peut-être rows = arcpy.UpdateCursor (layer)
artwork21

9

Vous pouvez désormais renommer un champ à l'aide de l'outil principal d'ArcGIS Desktop GP - Modifier le champ (gestion des données) . Cet outil permet de renommer des champs ou de renommer des alias de champs pour n'importe quelle table ou classe d'entités de géodatabase.

Cet outil est disponible à partir de 10.2.1 .


5
Cela ne prend en charge que certains formats de données. Notamment, il renvoie une erreur sur les fichiers de formes.
jpmc26

3

Pour renommer un champ dans une table ou une classe d'entités, j'essayerais la procédure décrite ici .

  1. Démarrez ArcMap et ouvrez la fenêtre Catalogue.
  2. Recherchez la base de données qui contient la table que vous souhaitez modifier.
  3. Cliquez avec le bouton droit sur la table et cliquez sur Propriétés.
  4. Cliquez sur l'onglet Champs.
  5. Cliquez sur le texte existant dans la colonne Nom du champ et saisissez un nouveau nom.

Je viens de tester cela sur une table de géodatabase fichier à l'aide d'ArcGIS for Desktop Standard 10.1 SP1 et cela a bien fonctionné.

Malheureusement, après avoir écrit ceci, j'ai recherché le fichier PDF Quoi de neuf dans ArcGIS 10.1 et j'ai constaté que cette fonctionnalité avait peut-être été ajoutée à cette version - il pourrait être utile de tester le dernier service pack de 10.0 pour voir s'il y était également porté.


1
Je crois qu'Emi cherche une solution arcpy.
artwork21

En fait, je suis à la recherche d'une solution arcpy
Emi

1
Mon erreur - je pensais que @Emi a dit "Y a-t-il une meilleure solution ..." [mon audace].
PolyGeo

1

deux gros problèmes avec le code:

  • si le dataType n'est pas un FeatureLayer, le programme sautera les manipulations fieldinfo, puis essaiera de définir la valeur sur un nouveau champ / renommé qui n'a jamais été créé / renommé

  • Les deux lignes:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    ont un gros problème. Si le code précédent fonctionnait Le champ "status" n'existe pas.


J'ai vérifié le code et alors que c'est une couche d'entités et que la classe d'entités contient un champ nommé "status", donne la même erreur
Emi

Si la première ligne fonctionne, la deuxième ligne ne fonctionnera pas.
mhoran_psprep

vous avez modifié les informations dans le calque, mais lisez et écrivez des données de / vers la classe de fonctionnalités
mhoran_psprep

1

Comment mapper field.type au type de champ de la méthode AddField_management?

Cela se fait automatiquement, selon cet article .

Et tandis que le champ est au milieu, le champ est supprimé du milieu et ajouté au dernier. Cela ne ressemble pas à un nom de champ renommé. Y a-t-il une meilleure solution qui m'aide à faire ces choses?

Comme je l'ai mentionné dans votre autre question , vos seules autres options sont de supprimer et de recréer l'ensemble de la classe / table d'entités ou de modifier la définition de colonne dans le SGBD sous-jacent.

Je suppose que vous pouvez supprimer toutes les colonnes utilisateur et les recréer dans l'ordre souhaité, mais c'est un peu fou. Le script de cette réponse fait exactement cela, vous pouvez probablement l'adapter à vos besoins.


tandis que field.type = "string", nous devons passer "text" à AddField_management. Je l'ai vérifié.
Emi

Êtes-vous sûr? Cela fonctionne pour moi à 10.0 SP5.
blah238

Cela me donne une erreur: arcgisscripting.ExecuteError: échec de l'exécution. Les paramètres ne sont pas valides. ERREUR 000800: la valeur n'est pas membre de TEXT | FLOAT | DOUBLE | COURT | LONG | DATE | BLOB | RASTER | GUID. Échec de l'exécution (AddField).
Emi

À quelle version / SP êtes-vous?
blah238

J'utilise 10.0. Je ne connais pas le numéro du Service Pack.
Emi
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.