Rinominare il campo usando ArcPy?


9

Cosa devo fare:

  1. rinominare un nome campo di una tabella / classe di funzionalità
  2. copia tutti i valori nel nuovo campo

Finora ho fatto il seguente codice come suggerisce @ 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)

Come posso mappare field.typeal AddField_managementtipo di campo del metodo? E mentre il campo si trova in una posizione intermedia, il campo viene eliminato dalla metà e aggiunto all'ultimo. Non sembra che il nome del campo sia stato rinominato.

Esiste una soluzione migliore che mi aiuti a fare queste cose?


Il campo del feature layer non viene rinominato qui, fieldInfo.setNewName (indice, "stat"). Questo è il motivo per cui ricevi l'errore sulla riga row.setValue ("stat", gValue).
artwork21

2
setNewName (index, new_field_name), deve essere solo per l'impostazione di nuovi nomi di campo, non per rinominare quelli esistenti.
artwork21

2
Un oggetto FieldInfo non fa nulla ai dati sottostanti, è semplicemente una rappresentazione delle proprietà del campo che può essere utilizzata come input per determinati strumenti per la creazione di nuovi dati, simile a un oggetto FieldMappings.
blah238,

1
È old_fieldun nome variabile o il nome effettivo del vecchio campo? Se si tratta di un nome di variabile, è necessario utilizzare la formattazione della stringa o la concatenazione per racchiudere il valore della variabile tra parentesi (parser VB) o punti esclamativi (parser Python).
blah238,

1
Un alias in generale è un "soprannome" o uno pseudonimo . Non è necessariamente uguale al nome della colonna effettiva nel database.
blah238,

Risposte:


15

Prova questo utilizzando una combinazione di strumenti arcpy Aggiungi campo, Calcola campo ed Elimina campo:

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
Voglio rendere uguali i due tipi di campo. ma i nomi field_type del metodo field.Type e AddField_management non sono uguali. Cosa fare?
Emi,

@Emi, non capisco cosa intendi per "due tipi di campo uguali"? Vuoi che il valore in "status" sia inserito in un nuovo campo chiamato "stat"?
artwork21

si, voglio il valore in "status", da inserire nel nuovo campo chiamato "stat"
Emi,

Ho anche provato fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")invece di fieldInfo.setNewName(index, "stat"). Ma lo stesso errore si è verificato con il mio codice.
Emi,

Per righe = arcpy.UpdateCursor (inputFeatureClass), forse prova file = arcpy.UpdateCursor (layer)
artwork21

9

Ora puoi rinominare un campo usando lo strumento ArcGIS Desktop GP principale: Alter Field (Data Management) . Questo strumento offre la possibilità di rinominare i campi o rinominare gli alias di campo per qualsiasi tabella di geodatabase o classe di caratteristiche.

Questo strumento è disponibile a partire da 10.2.1 .


5
Questo supporta solo determinati formati di dati. In particolare, genera un errore sui shapefile.
jpmc26,

3

Per rinominare un campo in una tabella o in una feature class, proverei la procedura qui descritta .

  1. Avviare ArcMap e aprire la finestra del catalogo.
  2. Individua il database che contiene la tabella che desideri modificare.
  3. Fare clic con il tasto destro del mouse sulla tabella e selezionare Proprietà.
  4. Fai clic sulla scheda Campi.
  5. Fai clic sul testo esistente nella colonna Nome campo e digita un nuovo nome.

Ho appena provato questo su una tabella di geodatabase di file usando ArcGIS per Desktop Standard 10.1 SP1 e ha funzionato bene.

Sfortunatamente, dopo averlo scritto, ho cercato il file PDF di Novità in ArcGIS 10.1 e ho scoperto che questa funzionalità potrebbe essere stata aggiunta a quella versione, ma potrebbe valere la pena testare l'ultimo service pack di 10.0 per vedere se è stato eseguito il porting anche lì.


1
Credo che Emi stia cercando una soluzione arcpy.
artwork21

In realtà sto cercando una soluzione arcpica
Emi,

1
Il mio errore - Ho pensato che @Emi dicesse "Esiste una soluzione migliore ..." [il mio coraggio].
PolyGeo

1

due grossi problemi con il codice:

  • se il tipo di dati non è un FeatureLayer, il programma salterà le manipolazioni fieldinfo e quindi tenterà di impostare il valore su un campo nuovo / rinominato che non è mai stato creato / rinominato

  • Le due linee:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    ha un grosso problema. Se il codice precedente ha funzionato Il campo "status" non esiste.


Ho controllato il codice e mentre è un feature layer e la feature class contiene un campo chiamato "status", dà lo stesso errore
Emi,

Se la prima riga funziona, la seconda riga no.
mhoran_psprep,

hai modificato le informazioni nel layer, ma stai leggendo e scrivendo dati da / verso la featureclass
mhoran_psprep

1

Come posso mappare field.type sul tipo di campo del metodo AddField_management?

Questo viene fatto automaticamente, secondo questo post .

E mentre il campo si trova in una posizione intermedia, il campo viene eliminato dalla metà e aggiunto all'ultimo. Non sembra che il nome del campo sia stato rinominato. Esiste una soluzione migliore che mi aiuti a fare queste cose?

Come ho già detto nella tua altra domanda , le uniche altre opzioni sono eliminare e ricreare l'intera classe / tabella di caratteristiche o modificare la definizione di colonna nel DBMS sottostante.

Suppongo che potresti eliminare tutte le colonne dell'utente e ricrearle nell'ordine desiderato, ma è un po 'folle. Lo script in questa risposta fa esattamente questo, probabilmente potresti adattarlo alle tue esigenze.


mentre field.type = "string", dobbiamo passare "text" su AddField_management. L'ho controllato.
Emi,

Sei sicuro? Funziona per me a 10.0 SP5.
blah238,

Mi dà errore: arcgisscripting.ExecuteError: Impossibile eseguire. I parametri non sono validi ERRORE 000800: il valore non è un membro di TEXT | GALLEGGIANTE | DOUBLE | CORTO | LUNGO | DATA | BLOB | RASTER | GUID. Impossibile eseguire (AddField).
Emi,

A quale versione / SP sei?
blah238,

Sto usando 10.0. Non conosco il numero del service pack.
Emi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.