2 votos

forLoop & joinField & diferentes nombres

Tengo una carpeta con una salida (shapefiles) de una iteración. En esta salida, quiero realizar una unión entre dos attributetables.

Hasta aquí todo bien. Ahora viene la parte complicada. Hay diferentes shapefiles (digamos 20), todos con diferentes nombres. Cada attributetable tiene exactamente la misma cantidad de campos (tal vez el número de filas difiere). Lo que quiero que haga el script es: elegir dos tablas de atributos específicas que pertenezcan juntas (basándose en el nombre), unirlas y luego pasar a las siguientes dos tablas de atributos hasta que no haya más tablas que unir. Todos los shapefiles tienen nombres diferentes, pero donde está el %Name% en el script, el nombre es el mismo.

Por ejemplo:

abc_clip_diss JOIN abc_full_diss
def_clip_diss JOIN def_full_diss 
ghi_clip_diss JOIN ghi_full_diss

Lo que conseguí hasta ahora y no es mucho porque soy muy nuevo en python es eso:

import arcpy

#set workspace
arcpy.env.workspace =  

#set variables
inFeatures = "%Name%_clip_diss"
joinField = "WLType"
joinTable = "%Name%_clip_full"
fieldList = ["area_ha"]

#JoinField "JoinField_management (in_data, in_field, join_table, join_field, {fields})"
JoinField_management ("inFeatures" , "joinField" , "joinTable" , "fieldList")

¿Creo que un bucle sería bueno aquí? Pero no entiendo muy bien cómo funciona un bucle. No entiendo lo que significa ese for XX en YY. Y no estoy seguro de si puedo hacer esa cosa: %Name%.

¿Alguna idea, pista o sugerencia?

EDITAR 7/8/14 4:00 pm

import arcpy
import os

#set workspace
arcpy.env.workspace = "C:\\Users\\Documents\\Wetland\\New_Folder"
ws = arcpy.env.workspace

#create a list of features
fcl = arcpy.ListFeatureClasses()

#loop through the list
for fc in fcl:
    basename = fcl.split("_")[0] #split name of features and only take the first word as a basename

    inFeatures = os.path.join(ws, basename + "_clip_diss") #The table or feature class to which the join table will be joined.
    joinField = "WLType" #The field in the input table on which the join will be based.
    joinTable = os.path.join(ws, basename + "_clip_full") #The table to be joined to the input table.
    fieldList = "WLType" #The field in the join table that contains the values on which the join will be based.

    #JoinField "JoinField_management (in_data, in_field, join_table, join_field, {fields})"
    arcpy.JoinField_management(inFeatures , joinField , joinTable , fieldList)

Al ejecutar este código me encuentro con varios problemas. El mayor fue el error 000732 que decía "los archivos no existen". He convertido todos mis shapefiles en una geodatabase que ha funcionado. La geodatabase está en la carpeta "New_Folder".

Pero al ejecutar el código ahora, sigue sin funcionar. No se une una tabla a otra. Me pregunto dónde está el problema. ¿Alguien puede verlo?

3voto

Aaron Puntos 25882

El adjunto (no probado) script toma el nombre de una clase de característica, lo divide por "_" y lo utiliza como nombre base para las operaciones de unión. La idea general es utilizar:

basename = fc.split("_")[0]

que convierte, por ejemplo, abc_clip_diss a abc

Luego, puedes usar ese nombre base para crear nuevas variables con os.path.join() :

inFeatures = os.path.join(ws, basename + "_clip_diss")
joinTable = os.path.join(ws, basename + "_clip_full")

Por último, combina esta sintaxis en un for para poder iterar sobre una serie de clases de características.


import arcpy, os

#set workspace
arcpy.env.workspace = r'C:\path\to\your\fcs'
ws = arcpy.env.workspace

fcs = arcpy.ListFeatureClasses()

for fc in fcs:
    basename = fc.split("_")[0]

    #set variables
    inFeatures = os.path.join(ws, basename + "_clip_diss")
    joinField = "WLType"
    joinTable = os.path.join(ws, basename + "_clip_full")
    fieldList = ["area_ha"]

    #JoinField "JoinField_management (in_data, in_field, join_table, join_field, {fields})"
    arcpy.JoinField_management (inFeatures , joinField , joinTable , fieldList)

0 votos

Muchas gracias. Lo probaré en un segundo. Tengo un par de preguntas para entenderlo todo ya que mi objetivo no es conseguir una "solución lista para usar" sino aprender algo para futuros problemas. Bucles: Dice for fc in fcs: mientras que fc no está definido. ¿Cómo sabe el bucle con qué frecuencia debe iterar? fc.split("_")[0] El cero significa que comienza con el primer miembro de la lista creada, ¿no? os.path.join(ws, basename + "_clip_diss") ¿Por qué tenemos que escribir os.path.join y ws ¿Otra vez?

0 votos

Y con tu edición acabas de responder a todas mis preguntas. Intentaré incorporarlo.

0 votos

for Los bucles siempre funcionan iterando sobre una lista. Para generar esa lista, utilizamos fcs = arcpy.ListFeatureClasses() que genera una lista de clases de características. Tenga en cuenta que la lista sólo contiene el nombre de cada FC en lugar de la ruta completa. fc se define como una variable en cada iteración, por lo que se puede llamar dentro del bucle. La página web for iterará sobre toda la lista. Si tiene 300 FCs en un área de trabajo, entonces el bucle for El bucle iterará sobre los 300 FCs. `

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