Cambiar el nombre del campo con ArcPy?

9

Lo que necesito hacer:

  1. cambiar el nombre de un campo de una tabla / clase de entidad
  2. copiar todos los valores al nuevo campo

Hasta ahora he hecho el siguiente código como @ artwork21 sugiere:

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)

¿Cómo puedo asignar field.typeal AddField_managementtipo de campo del método? Y mientras el campo está en un lugar intermedio, el campo se elimina del medio y se agrega al último. Eso no parece que se cambie el nombre del campo.

¿Hay alguna solución mejor que me ayude a hacer estas cosas?

Emi
fuente
Su campo de capa de entidades no se renombra aquí, fieldInfo.setNewName (index, "stat"). Es por eso que obtiene su error en la línea row.setValue ("stat", gValue).
artwork21
2
setNewName (index, new_field_name), debe ser solo para establecer nuevos nombres de campo, no renombrar los existentes.
artwork21
2
Un objeto FieldInfo no hace nada a los datos subyacentes, es simplemente una representación de las propiedades del campo que se puede usar como entrada para ciertas herramientas para crear nuevos datos, similar a un objeto FieldMappings.
blah238
1
¿Es old_fieldun nombre de variable o el nombre real del campo anterior? Si se trata de un nombre de variable, debe utilizar el formato de cadena o la concatenación para ajustar el valor de la variable con los corchetes (analizador VB) o los signos de exclamación (analizador Python).
blah238
1
Un alias en general es un "apodo" o un seudónimo . No es necesariamente igual al nombre real de la columna en la base de datos.
blah238

Respuestas:

15

Pruebe esto usando una combinación de las herramientas Agregar campo, Calcular campo y Eliminar 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")
artwork21
fuente
1
Quiero hacer que los dos campos sean del mismo tipo. pero los nombres field_Type y AddField_management del método field_type no son iguales. ¿Qué hacer?
Emi
@Emi, no entiendo lo que quieres decir con "dos tipos de campo iguales"? ¿Desea que el valor en "estado" se coloque en un nuevo campo llamado "stat"?
artwork21
Sí, quiero que el valor en "estado", para poner en el nuevo campo llamado "stat"
Emi
También lo intenté en fieldInfo.addField ("status", "stat", "VISIBLE", "NONE")lugar de fieldInfo.setNewName(index, "stat"). Pero el mismo error ocurrió con mi código.
Emi
Para filas = arcpy.UpdateCursor (inputFeatureClass), tal vez intente filas = arcpy.UpdateCursor (capa)
artwork21
9

Ahora puede cambiar el nombre de un campo con la herramienta básica ArcGIS Desktop GP: Alterar campo (Administración de datos) . Esta herramienta proporciona la capacidad de cambiar el nombre de los campos o cambiar el nombre de los alias de campo para cualquier tabla de geodatabase o clase de entidad.

Esta herramienta está disponible a partir de 10.2.1 .

Alex Tereshenkov
fuente
55
Esto solo admite ciertos formatos de datos. En particular, arroja un error en los archivos de forma.
jpmc26
3

Para cambiar el nombre de un campo en una tabla o clase de entidad, probaría el procedimiento descrito aquí .

  1. Inicie ArcMap y abra la ventana Catálogo.
  2. Localice la base de datos que contiene la tabla que desea modificar.
  3. Haga clic derecho en la tabla y haga clic en Propiedades.
  4. Haz clic en la pestaña Campos.
  5. Haga clic en el texto existente en la columna Nombre del campo y escriba un nuevo nombre.

Acabo de probar esto en una tabla de geodatabase de archivos usando ArcGIS for Desktop Standard 10.1 SP1 y funcionó bien.

Desafortunadamente, después de escribir esto, busqué el archivo PDF What's New in ArcGIS 10.1 y descubrí que esta funcionalidad puede haberse agregado en esa versión, pero aún así podría valer la pena probar el último paquete de servicio de 10.0 para ver si también fue portado de nuevo allí.

PolyGeo
fuente
1
Creo que Emi está buscando una solución rápida.
artwork21
En realidad, estoy buscando una solución para Arcpy
Emi
1
Mi error: pensé que @Emi dijo "¿Hay alguna solución mejor ..." [mi negrita].
PolyGeo
1

Dos grandes problemas con el código:

  • si dataType no es un FeatureLayer, el programa omitirá las manipulaciones de información de campo y luego intentará establecer el valor en un campo nuevo / renombrado que nunca fue creado / renombrado

  • Las dos lineas:

    gValue = row.getValue("status")

    row.setValue("stat", gValue)

    tiene un gran problema Si el código anterior funcionó El campo "estado" no existe.

mhoran_psprep
fuente
Verifiqué el código y, si bien es una capa de entidades y la clase de entidad contiene un campo llamado "estado", da el mismo error
Emi
Si la primera línea funciona, la segunda línea no.
mhoran_psprep
cambiaste la información en la capa, pero estás leyendo y escribiendo datos desde / hacia la clase de entidad
mhoran_psprep
1

¿Cómo puedo asignar field.type al tipo de campo del método AddField_management?

Esto se hace automáticamente, de acuerdo con esta publicación .

Y mientras el campo está en un lugar intermedio, el campo se elimina del medio y se agrega al último. Eso no parece que se cambie el nombre del campo. ¿Hay alguna solución mejor que me ayude a hacer estas cosas?

Como mencioné en su otra pregunta , sus únicas otras opciones son soltar y volver a crear toda la clase / tabla de entidad o modificar la definición de columna en el DBMS subyacente.

Supongo que podría eliminar todas las columnas de usuario y volver a crearlas en el orden deseado, pero eso es un poco loco. El script en esta respuesta hace exactamente eso, probablemente podría adaptarlo a sus necesidades.

blah238
fuente
mientras que field.type = "string", tenemos que pasar "texto" en AddField_management. Lo he comprobado
Emi
¿Estás seguro? A mí me funciona a las 10.0 SP5.
blah238
Me da error: arcgisscripting.ExecuteError: no se pudo ejecutar. Los parámetros no son válidos. ERROR 000800: el valor no es miembro de TEXT | FLOTADOR | DOBLE | CORTO | LARGO | FECHA | BLOB | RASTER | GUID. Error al ejecutar (AddField).
Emi
¿En qué versión / SP estás?
blah238
Estoy usando 10.0. No sé el número del paquete de servicio.
Emi