Verwenden mehrerer Platzhalterparameter mit arcpy.ListFeatureClasses

12

Ich weiß, dass es einen Weg geben muss, aber ich habe Probleme, herauszufinden, wie das geht. Ich möchte eine Liste von Feature-Classes erstellen, für die Vorgänge ausgeführt werden sollen. Ich möchte jedoch, dass die Liste Feature-Classes enthält, die zwei separate und unterschiedliche Dateinamen-IDs haben. Der Code würde ungefähr so ​​aussehen:

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

Ich weiß, dass OR falsch ist, aber es gibt eine Möglichkeit, dies zu tun, ohne Code neu schreiben zu müssen, um mit dem zweiten Platzhalter zu arbeiten. Vielen Dank, dass Sie Gicht helfen. Ich weiß, dass es in den Select By Attributes eine Auswahlmethode gibt, die die Verwendung mehrerer Platzhalter mithilfe der OR-Anweisung ermöglicht.

Standard
quelle
Der Platzhalterparameter verwendet nur eine Zeichenfolge als Eingabe, sodass er nicht ListFeatureClasses()zweimal ausgeführt wird (was für große Verzeichnisse möglicherweise zu langsam sein kann. Es ist am besten, keinen Platzhalter zu übergeben und anschließend das Ergebnis zu filtern.
Paul
Paul, genau das macht die unten stehende Antwort zum Listenverständnis - sie durchläuft die Liste und filtert sie basierend auf der if-Anweisung.
Klassen
@dklassen, OP sucht nach FC, die mit "_Y" enden, nicht starten. Sie können dies als Platzhalter für eine GDB verwenden, jedoch keine Shapefiles mit Ihrem Code.
Paul

Antworten:

16

Addieren Sie die beiden, sie sind nur Listen.

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

So entfernen Sie Duplikate:

FCS = set(arcpy.ListFeatureClasses("X_*") + arcpy.ListFeatureClasses("*_Y"))
Jason Scheirer
quelle
Dies funktioniert auch, danke @Jason Sheirer. Die Verwendung von Starts und Endes funktioniert für mich in einer Datei GDB. Als ich das Skript geändert habe, mit dem ich mit einer SDE gearbeitet habe, hat es aus irgendeinem Grund nicht funktioniert. Die von Ihnen erwähnte Methode funktioniert in SDE.
Standard
6

Sie könnten es etwas anders angehen:

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
quelle
Dies wird nicht wirklich funktionieren, wenn Sie nicht in einer GDB sind. Die Erweiterung wird für Shapefiles zurückgegeben.
Paul
Dies sollte für jede Feature-Class in Ihrem festgelegten Arbeitsbereich funktionieren. Einschließlich Shapefiles - warum sollten wir keine Erweiterung zurückgeben wollen?
Klassen
Weil Sie damit keinen Platzhalter gegen endende Zeichen setzen können - genau das scheint OP zu tun.
Paul
@Paul Modified - danke für die Korrektur. Ich habe den Teil "_Y" nicht gesehen.
Klassen
2
Ein bisschen pingelig, aber du solltest es benutzen os.path.splitext(). Das Shapefile könnte einen Punkt im Namen haben. +1
Paul
1

Dieses Skript gibt mehrere Platzhalter in einer Liste an cases[]. Anschließend werden einzelne Fälle durchlaufen und die gewünschten Feature-Classes 'arcpy.ListFeatureClasses ()' aufgelistet. Jede ausgewählte Feature-Class wird mit '.extend' zur neuen Liste der Feature-Classes hinzugefügt.

# 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
quelle