4 votos

Identificar y eliminar todos los campos no requeridos de Shapefile utilizando ArcPy

Tengo algunos Shapefiles dentro de una Carpeta y por el bien de la compresión de datos quiero eliminar todos los campos de la Tabla de Contenido que pueden ser eliminados (que no son necesarios).

Lo que tengo:

Lo que espero:

enter image description here

Mi código que no funciona:

import arcpy
import os

arcpy.env.workspace = r"C:\Temp\"
fcList = arcpy.ListFeatureClasses()

for fc in fcList:
    fields = arcpy.ListFields(fc)
    for field in fields:
        delFlds = [field for field in fields if field != "FID" or field != "Shape"]
        arcpy.DeleteField_management(fc, delFlds)

Estoy utilizando Python 2.7 y ArcMap 10.4.1

8voto

Anton8000 Puntos 165

Usted está listando objetos de campo con ListFields, no los nombres de los campos que deben introducirse en DeleteField. Por lo tanto, cambie:

[field for field in fields if field != "FID" or field != "Shape"]

a:

[field.name for field in fields if field.name not in ("FID","Shape")]

Pero probablemente sea mejor utilizar el required ya que los campos de ID de objeto y de forma pueden tener nombres diferentes en distintas clases de características:

for fc in fcList:
    fields_to_delete = [field.name for field in arcpy.ListFields(fc) if not field.required]
    fields_to_delete.pop() #Keep one non-required field
    for field in fields_to_delete:
        arcpy.DeleteField_management(fc, field)

0 votos

Hola BERA, ¡gracias por tu rápida respuesta! Sin embargo viene un Error diciendo: "Las clases y tablas de características deben tener al menos un campo distinto de OID y Shape".

0 votos

@gisgis ok tienes que quedarte con uno entonces. He editado mi respuesta.

2voto

Suelo hacer una lista explícita de los campos que quiero conservar, y luego hago un bucle y borro los demás. No recuerdo dónde vi este método originalmente, pero podría haber venido de esto discusión sobre el mantenimiento de sólo ciertos campos .

Me gusta el uso que hace @BERA de field.required y sugeriría usar eso - aunque históricamente he enumerado OBJECTID , FID , SHAPE etc. explícitamente.

Así, por ejemplo, si se necesita mantener sólo un campo llamado DIMENSION y un campo llamado RESPONSIBLE_PARTY :

keep_fields = ["DIMENSION","RESPONSIBLE_PARTY"]

fieldNameList = []
fieldObjList = arcpy.ListFields(table)

for field in fieldObjList:
    if (not field.name in keep_fields) and (not field.required):
        fieldNameList.append(field.name)

arcpy.DeleteField_management(table,fieldNameList)

0 votos

Si, pero como dijo @BERA los nombres de los campos pueden cambiar de un archivo shape a otro con letras mayúsculas o algo así, pero es bueno saberlo, gracias por tu contribución.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X