Usando vários parâmetros curinga com arcpy.ListFeatureClasses

12

Eu sei que tem que haver uma maneira de fazer isso, mas estou tendo problemas para descobrir como fazê-lo. Gostaria de criar uma lista de classes de recursos para executar operações. No entanto, desejo que a lista contenha classes de recursos que tenham 2 identificadores de nome de arquivo separados e distintos. O código seria algo como:

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

Eu sei que OU está incorreto, no entanto, existe alguma maneira de fazer isso sem precisar reescrever o código para trabalhar com o segundo curinga. Obrigado por ajudar a gota, eu sei que existe um método de seleção no Select By Attributes que permite o uso de vários curingas usando a instrução OR.

padrão
fonte
O parâmetro curinga aceita apenas uma string como entrada, portanto, menos do que executar ListFeatureClasses()duas vezes (o que pode ser muito lento para diretórios grandes, é melhor não passar curinga e depois filtrar o resultado depois.)
Paul
Paul, é exatamente isso que a compreensão da lista responde abaixo - ela percorre a lista e a filtra com base na instrução if.
22414 dklassen
@dklassen, OP está procurando FC que termine em "_Y", não inicie. Você pode curinga-lo em um GDB, mas não em shapefiles com seu código.
Paul

Respostas:

16

Adicione os dois juntos, eles são apenas listas.

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

Para eliminar duplicatas:

FCS = set(arcpy.ListFeatureClasses("X_*") + arcpy.ListFeatureClasses("*_Y"))
Jason Scheirer
fonte
Isso também funciona, graças a Jason Sheirer, usando o beginwith e o endswith funcionam para mim em um arquivo GDB. Quando alterei o script que estava usando para trabalhar com uma SDE, ele não funcionou por algum motivo. O método que você mencionou funciona no SDE.
standard
6

Você poderia abordar um pouco de maneira 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
fonte
Isso realmente não funcionará, a menos que você esteja em um GDB. A extensão é retornada para shapefiles.
Paul
Isso deve funcionar para qualquer classe de recurso dentro do seu espaço de trabalho definido. Incluindo shapefiles - por que não queremos uma extensão retornada?
22414 dklassen
Porque você não pode curinga com isso nos caracteres finais - que é o que o OP parece estar fazendo.
Paul
@ Paul Modified - obrigado pela correção. Não vi a parte "_Y".
dklassen
2
Um pouco nervoso, mas você deve usar os.path.splitext(). O shapefile pode ter um ponto no nome. 1
Paul
1

Este script especifica vários curingas em uma lista cases[]. Depois, faz um loop em casos únicos, listando as classes de recurso desejadas 'arcpy.ListFeatureClasses ()'. Cada classe de recurso selecionada é adicionada à nova lista de classes de recurso usando '.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
fonte