Tengo unas pocas docenas de clases de entidad, una de las cuales contiene el campo que estoy buscando. Se almacenan en varias geodatabases de archivos diferentes.
¿Hay una forma rápida de buscar en cada clase de entidad para encontrar la que tiene mi campo? ¿O tengo que verificar la tabla de atributos de cada uno en el Catálogo? Algunos de los archivos tienen los mismos nombres pero se almacenan en ubicaciones separadas.
Me gustaría poder hacer esto dentro de una Calculate Value
herramienta en ModelBuilder, para que cada vez que lo necesitara, pudiera ejecutar el modelo en un solo archivo gdb y buscaría en todas las clases de entidad dentro de ese gdb y buscar el campo .
Hasta ahora, tengo un iterador de clase de entidad que itera sobre todas las clases de entidad en el archivo gdb de forma recursiva. Dentro del Calculate Value
tengo el siguiente código:
findField(r"%Feature%", "%Search Field%")
def findField(fc, fi):
lst = arcpy.ListFields(fc)
for f in lst:
if f.name == fi:
return fc
else:
return "not found"
Los valores devueltos se recopilan Output Values
como cadenas. La salida para todas las clases de entidad no se ha encontrado, aunque el campo exista en al menos 4 de ellas.
fuente
Calculate Value
para buscar el campo y devolver la ruta de la clase de entidad como una cadena si encuentra el campo; vea mi respuesta a continuación.Respuestas:
Preferiría una comprensión de la lista en lugar de operaciones de cadena (como la respuesta aceptada). En mi opinión, esto es más legible y pitónico. Además, el enfoque de comprensión de la lista podría ampliarse agregando funcionalidades adicionales (
str.lower()
como hizo @RyanDalton) de manera muy fácil.Si prefiere la declaración if-else de un revestimiento:
O incluso más corto, pero menos legible:
fuente
Echa un vistazo a esta función de Bjorn Kuiper para probar si existe un campo :
con el siguiente ejemplo de uso:
fuente
puedes usar arcpy:
Además de esto, puede usar os.walk para archivos en su disco como:
Espero que te ayude....
fuente
Arabella, ¿son tus clases de características en conjuntos de datos de características? Si es así, la solución de @ Aragon no funcionará porque necesita recorrer los conjuntos de datos de características y luego verificar las clases de características.
Utilizando el código de @ Aragon y el código de @ gotchula de Listar todas las clases de entidades en GDB, incluso dentro de los conjuntos de datos de entidades, produje el siguiente código que leerá todos los conjuntos de datos y clases de entidades en una geodatabase.
NOTA : Por defecto, ListFields parece ser sensible a mayúsculas y minúsculas. He agregado código para convertir tanto el nombre de campo definido por el usuario como el nombre de ListField a minúsculas para búsquedas que no distinguen entre mayúsculas y minúsculas. Probablemente también desee deshabilitar la mayoría de las declaraciones de impresión, pero las dejé allí para que pueda seguir el código mientras se ejecuta. También creé la subfunción FindField dentro de para poder llamarla varias veces en el script sin tener que volver a codificarla.
fuente
Calculate Value
embargo, no estoy seguro de qué quiero que regrese, ¿podríareturn "true" if FindField(fc,myField) =="true" else "false"
?Algunos han bailado en torno a la forma en que haría esto, pero solo quiero agregar una forma sencilla de una línea para hacer esto:
Lo que quizás sea más útil (si está iterando a través de muchas clases de entidad) usaría lo contrario de lo anterior como filtro:
fuente
Encontré la respuesta con ayuda del código en la respuesta a esta pregunta . Tomé todos los nombres de campo, los convertí en una cadena y luego busqué en la cadena mi campo. El código en el
Calculate Value
ahora se ve de la siguiente manera:El
Output Values
ahora contiene la lista completa de clases de entidad que tiene el campo que busqué ynot found
el resto.fuente