Uso de múltiples parámetros comodín con arcpy.ListFeatureClasses

12

Sé que tiene que haber una manera de hacer esto, pero tengo problemas para descubrir cómo hacerlo. Sin embargo, me gustaría crear una lista de clases de entidad para realizar operaciones, quiero que la lista contenga clases de entidad que tengan 2 identificadores de nombre de archivo distintos y separados. El código se vería así:

FCS = arcpy.ListFeatureClasses("X_*" OR "*_Y")

Sin embargo, sé que OR es incorrecto, ¿hay alguna forma de hacerlo sin tener que volver a escribir el código para trabajar con el segundo comodín? Gracias por ayudar a la gota, sé que hay un método de selección en Seleccionar por atributos que permite el uso de comodines múltiples mediante la instrucción OR.

estándar
fuente
El parámetro comodín solo toma una cadena como entrada, por lo que antes de ejecutarse ListFeatureClasses()dos veces (lo que podría ser demasiado lento para directorios grandes, es mejor no pasar ningún comodín y luego filtrar el resultado después.
Paul
Paul, eso es exactamente lo que hace la respuesta de comprensión de la lista a continuación: se ejecuta a través de la lista y la filtra en función de la declaración if.
dklassen
@dklassen, OP está buscando FC que termine en "_Y", no comience. Puede usar ese comodín contra un GDB, pero no los archivos de forma con su código.
Paul

Respuestas:

16

Agregue los dos juntos, son solo listas.

FCS = arcpy.ListFeatureClasses("X_*") + arcpy.ListFeatureClasses("*_Y")

Para eliminar duplicados:

FCS = set(arcpy.ListFeatureClasses("X_*") + arcpy.ListFeatureClasses("*_Y"))
Jason Scheirer
fuente
Esto también funciona, gracias @ Jason Sheirer, el uso de comienza con y termina con funciona para mí en un archivo GDB. Cuando modifiqué el script que estaba usando para trabajar con un SDE, no funcionó por alguna razón. El método que mencionó funciona en SDE.
estándar
6

Podrías abordarlo un poco diferente:

import arcpy
import os

arcpy.env.workspace = 'c:\temp'
fcs = [fc for fc in arcpy.ListFeatureClasses() if fc.startswith('X_') or os.path.splitext(fc)[0].endswith('_Y')]
dklassen
fuente
Esto realmente no funcionará a menos que esté en un GDB. La extensión se devuelve para los archivos de forma.
Paul
Esto debería funcionar para cualquier clase de entidad dentro de su espacio de trabajo establecido. Incluyendo archivos de forma: ¿por qué no queremos que se devuelva una extensión?
dklassen
Porque no puedes usar comodines con esto contra los caracteres finales, que es lo que OP parece estar haciendo.
Paul
@Paul modificado: gracias por la corrección. No vi la parte "_Y".
dklassen
2
Un poco quisquilloso, pero deberías usarlo os.path.splitext(). El archivo de forma podría tener un punto en el nombre. +1
Paul
1

Este script especifica múltiples comodines en una lista cases[]. Luego, recorre casos únicos y enumera las clases de entidad deseadas 'arcpy.ListFeatureClasses ()'. Cada clase de entidad seleccionada es la que se agrega a la nueva lista de clases de entidad utilizando '.extend'

# Create a list of the wildcards 
cases = ["X_*", ""*_Y""]

# Create empty list to store all selected files
fcs= []

# Loop through files to select files following multiple wildcards
for case in cases:
    fc = arcpy.ListFeatureClasses(case)
    # Insert the fc to the list
    fcs.extend(fc)
maycca
fuente