2 votos

Cambiar la longitud de los campos de cadena en featureclass usando arcpy v10.1

Estoy tratando de editar la longitud de todos los campos de texto en una clase de característica. La clase de característica tiene un montón de campos así que quiero hacer esto en python. Sólo tengo acceso a v10.1 por lo que no puede utilizar la opción AlterField_management.

Mi método consiste en utilizar la conversión de fc a fc con una asignación de campos adecuada.

Abajo está mi código pero no altera la longitud de los campos de texto como se pretende. La conversión de fc a fc sigue adelante pero sin cambios en ninguna de las propiedades de los campos. Estoy bastante seguro de que el problema es con el mapeo de campo, pero no puedo averiguarlo.

import arcpy

infc =  r"C:\path to original fc"

out_space = r"C:\path to out gdb"
out_fc = "fc_newfieldlengths"

# set up field mappings object
fms = arcpy.FieldMappings()

# Create list of all non-string fields to skip when creating the fieldmaps

text_fields = arcpy.ListFields(infc, field_type = 'String')
all_fields = arcpy.ListFields(infc)

skip_fields = [x for x in all_fields if x not in text_fields]

# create field mapping with new length for the text fields
for field in all_fields:
    if field in skip_fields:
        pass
    else:   
        fm = arcpy.FieldMap()

        fm.addInputField(infc, field.name)

        outfield = fm.outputField
        outfield.length = 150
        outfield.name = field.name

        fm.outputField = outfield

        fms.addFieldMap(fm)

# Copy featureclass with new field mapping
arcpy.FeatureClassToFeatureClass_conversion(infc, out_space, out_fc, field_mapping = fms)

# End of script

Si sólo intentaba recorrer una lista de campos de cadena para generar los mapas de campo, descubría que todos los campos se convertían en campos de cadena en la salida, no sólo los campos que me interesaba modificar.

Para evitar cambiar el tipo de datos de todos los campos, he creado una lista de omisión de los campos que no se deben modificar. De este modo, se conservan los tipos de datos, pero no se modifican las longitudes de los campos de texto (como ocurría anteriormente, pero también resulta molesto cambiar todos los tipos de datos).

Sospecho que no entiendo las asignaciones de campos lo suficientemente bien como para saber qué estoy haciendo mal.

2voto

Tedy Puntos 46

Tu código probablemente falla porque estás intentando comparar objetos de campo. En su lugar, deberías comparar nombres de campo.

skip_fields = [x.name for x in all_fields if x not in text_fields]
for field in all_fields:
    if field.name in skip_fields:
        pass

Aquí hay una variación de código que funciona para mí:

inFc = r"C:\Workspace\Workspace.gdb\FM_in"
outPath = r"C:\Workspace\Workspace.gdb"
outName = "FM_out"

import arcpy

fms = arcpy.FieldMappings ()

shapeFld = arcpy.Describe (inFc).shapeFieldName
oidFld = arcpy.Describe (inFc).OIDFieldName

for field in arcpy.ListFields (inFc):
    if field.name in (shapeFld, oidFld):
        continue

    if field.type == "String":

        fm = arcpy.FieldMap ()
        fm.addInputField (inFc, field.name)
        field.length = 150
        fm.outputField = field
        fms.addFieldMap(fm)

    else:
        fm = arcpy.FieldMap ()
        fm.addInputField (inFc, field.name)
        fms.addFieldMap(fm)

arcpy.FeatureClassToFeatureClass_conversion (inFc, outPath, outName, "", fms)

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