Suite

Modifier la longueur des champs de chaîne dans la classe d'entités à l'aide d'arcpy v10.1

Modifier la longueur des champs de chaîne dans la classe d'entités à l'aide d'arcpy v10.1


J'essaie de modifier la longueur de tous les champs de texte d'une classe d'entités. La classe d'entités a beaucoup de champs, je veux donc le faire en python. Je n'ai accès qu'à la v10.1, je ne peux donc pas utiliser l'option AlterField_management.

La façon dont je m'y prends est d'utiliser la conversion fc en fc avec un mappage de champ approprié.

Vous trouverez ci-dessous mon code, mais il ne modifie pas la longueur des champs de texte comme prévu. La conversion de fc en fc se poursuit mais sans modification des propriétés du champ. Je suis presque sûr que le problème vient du mappage des champs, mais je n'arrive pas à le comprendre.

import arcpy infc = r"C:path to original fc" out_space = r"C:path to out gdb" out_fc = "fc_newfieldlengths" # configurer les mappages de champs objet fms = arcpy.FieldMappings() # Créer une liste de tous les non -string champs à ignorer lors de la création des 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] # créer un mappage de champ avec nouvelle longueur des champs de texte pour le champ dans all_fields : if field dans skip_fields : passez 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) # Copier la featureclass avec le nouveau mappage de champ arcpy.FeatureClassToFeatureClass_conversion(infc, out_space, out_fc, field_mapping = fms) # Fin du script

Si j'essayais uniquement de parcourir une liste de champs de chaîne pour générer les mappages de champs, j'ai constaté que tous les champs ont été modifiés en champs de chaîne dans la sortie, pas seulement les champs que je souhaite modifier.

Pour éviter de changer le type de données pour tous les champs, j'ai créé une liste de sauts de champs à ne pas modifier - cela parvient à préserver les types de données mais n'a pas modifié les longueurs des champs de texte (comme cela se produisait auparavant, mais changeant également de manière ennuyeuse tous les types de données ).

Je soupçonne que je ne comprends tout simplement pas assez bien les mappages de champs pour savoir ce que je fais mal.


Votre code échoue probablement parce que vous essayez de comparer des objets de champ. Au lieu de cela, vous devez comparer les noms de champs.

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

Voici une variante de code qui fonctionne pour moi :

inFc = r"C:WorkspaceWorkspace.gdbFM_in" outPath = r"C:WorkspaceWorkspace.gdb" outName = "FM_out" import arcpy fms = arcpy.FieldMappings () shapeFld = arcpy.Describe (inFc) .shapeFieldName oidFld = arcpy.Describe (inFc).OIDFieldName pour le champ dans arcpy.ListFields (inFc) : si field.name dans (shapeFld, oidFld) : continue si 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)

Voir la vidéo: Rellenar tabla de forma automática con Python en ArcGIS