Używanie wielu parametrów wieloznacznych w arcpy.ListFeatureClasses


12

Wiem, że musi być na to sposób, ale mam problem z ustaleniem, jak to zrobić. Chciałbym utworzyć listę klas elementów, na których będą przeprowadzane operacje, jednak chcę, aby lista zawierała klasy elementów, które mają 2 oddzielne i różne identyfikatory nazw plików. Kod wyglądałby mniej więcej tak:

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

Wiem, że LUB jest niepoprawny, czy jest jakiś sposób, aby to zrobić bez konieczności ponownego pisania kodu, aby pracować z drugą symbolem wieloznacznym. Dzięki za pomoc dnie, wiem, że istnieje metoda wyboru w Select By Attributes, która pozwala na użycie wielu symboli wieloznacznych za pomocą instrukcji OR.


Parametr wieloznaczny pobiera tylko ciąg znaków jako dane wejściowe, więc ListFeatureClasses()nie trzeba go uruchamiać dwukrotnie (co może być zbyt wolne dla dużych katalogów, najlepiej nie przekazywać symboli wieloznacznych, a następnie po prostu filtrować wynik po.
Paul

Paul, dokładnie to robi poniższa odpowiedź na zrozumienie listy - przegląda listę i filtruje ją na podstawie instrukcji if.
dklassen

@dklassen, OP szuka FC, które kończą się na „_Y”, a nie zaczynają. Możesz użyć tego symbolu wieloznacznego względem GDB, ale nie shapefile za pomocą swojego kodu.
Paul

Odpowiedzi:


16

Dodaj dwa razem, to tylko listy.

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

Aby wyeliminować duplikaty:

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

Działa to również, dzięki @Jason Sheirer, używanie startwith i endwith działa dla mnie w pliku GDB. Kiedy zmieniłem skrypt, którego używałem do pracy z SDE, z jakiegoś powodu nie działał. Wspomniana metoda działa w SDE.
standardowy

6

Możesz podejść do tego trochę inaczej:

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')]

To naprawdę nie zadziała, chyba że jesteś w GDB. Rozszerzenie jest zwracane dla plików kształtów.
Paul

Powinno to działać dla dowolnej klasy obiektów w ustawionym obszarze roboczym. W tym pliki kształtów - dlaczego nie chcielibyśmy zwrócić rozszerzenia?
dklassen

Ponieważ nie można użyć symboli wieloznacznych w stosunku do znaków kończących - tak właśnie wygląda OP.
Paul

@Paul Modified - dzięki za korektę. Nie widziałem części „_Y”.
dklassen

2
Trochę dziwaczne, ale powinieneś użyć os.path.splitext(). Plik kształtu może mieć kropkę w nazwie. +1
Paul

1

Skrypty te określają wiele symboli wieloznacznych na liście cases[]. Następnie zapętla unikalne przypadki, wyświetlając listę pożądanych klas elementów „arcpy.ListFeatureClasses ()”. Każda wybrana klasa obiektów jest dodawana do nowej listy klas obiektów za pomocą „.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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.