Utilisation de plusieurs paramètres génériques avec arcpy.ListFeatureClasses

12

Je sais qu'il doit y avoir un moyen de le faire, mais j'ai du mal à comprendre comment le faire. Je voudrais créer une liste de classes d'entités pour effectuer des opérations, cependant, je veux que la liste contienne des classes d'entités qui ont 2 identificateurs de nom de fichier distincts et distincts. Le code ressemblerait à quelque chose comme:

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

Je sais que OR est incorrect cependant, existe-t-il un moyen de le faire sans avoir à réécrire le code pour travailler avec le deuxième caractère générique. Merci d'avoir aidé la goutte, je sais qu'il existe une méthode de sélection dans la sélection par attributs qui permet l'utilisation de plusieurs caractères génériques à l'aide de l'instruction OR.

la norme
la source
Le paramètre générique ne prend qu'une chaîne en entrée, si court qu'il ne s'exécute ListFeatureClasses()deux fois (ce qui pourrait potentiellement être trop lent pour les grands répertoires, il est préférable de ne passer aucun caractère générique, puis de filtrer le résultat après.
Paul
Paul, c'est exactement ce que fait la réponse de compréhension de liste ci-dessous - elle parcourt la liste et la filtre en fonction de l'instruction if.
dklassen
@dklassen, OP recherche un FC qui se termine par "_Y", pas un début. Vous pouvez utiliser ce caractère générique par rapport à un GDB, mais pas les fichiers de formes avec votre code.
Paul

Réponses:

16

Ajoutez les deux ensemble, ce ne sont que des listes.

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

Pour éliminer les doublons:

FCS = set(arcpy.ListFeatureClasses("X_*") + arcpy.ListFeatureClasses("*_Y"))
Jason Scheirer
la source
Cela fonctionne aussi, merci @Jason Sheirer, en utilisant startwith et endswith fonctionne pour moi dans un fichier GDB. Lorsque j'ai modifié le script que j'utilisais pour travailler avec un SDE, cela n'a pas fonctionné pour une raison quelconque. La méthode que vous avez mentionnée fonctionne dans SDE.
le
6

Vous pourriez l'approcher un peu différemment:

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
la source
Cela ne fonctionnera vraiment que si vous êtes dans un GDB. L'extension est renvoyée pour les fichiers de formes.
Paul
Cela devrait fonctionner pour n'importe quelle classe d'entités dans votre espace de travail défini. Y compris les fichiers de formes - pourquoi ne voudrions-nous pas qu'une extension soit retournée?
dklassen
Parce que vous ne pouvez pas utiliser de caractères génériques avec ceci contre les caractères de fin - ce que OP semble faire.
Paul
@Paul Modified - merci pour la correction. Je n'ai pas vu la partie "_Y".
dklassen
2
Un peu nitpicky, mais vous devriez utiliser os.path.splitext(). Le fichier de formes peut avoir un point dans le nom. +1
Paul
1

Ces scripts spécifient plusieurs caractères génériques dans une liste cases[]. Ensuite, il boucle sur des cas uniques, répertoriant les classes d'entités souhaitées «arcpy.ListFeatureClasses ()». Chaque classe d'entités sélectionnée est celle ajoutée à la nouvelle liste de classes d'entités à l'aide de '.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
la source