Использование нескольких подстановочных параметров с arcpy.ListFeatureClasses

12

Я знаю, что должен быть способ сделать это, но мне сложно понять, как это сделать. Я хотел бы создать список классов пространственных объектов для выполнения операций, однако я хочу, чтобы этот список содержал классы пространственных объектов, которые имеют 2 отдельных идентификатора имени файла. Код будет выглядеть примерно так:

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

Я знаю, что ИЛИ неверно, однако, есть ли способ сделать это без необходимости переписывать код для работы со вторым подстановочным знаком. Спасибо за помощь подагре, я знаю, что есть метод выбора в Select By Attributes, который позволяет использовать несколько подстановочных знаков с помощью оператора OR.

стандарт
источник
Параметр с подстановочными знаками принимает только строку в качестве входных данных, так что короткого запуска ListFeatureClasses()дважды (что потенциально может быть слишком медленным для больших каталогов, лучше не пропускать подстановочные знаки, а затем просто фильтровать результат после.
Пол
Пол, это именно то, что делает ответ для понимания списка ниже - он просматривает список и фильтрует его на основе оператора if.
dklassen
@dklassen, OP ищет ФК, который заканчивается на "_Y", а не на старте. Вы можете использовать это в GDB, но не в шейп-файлах с вашим кодом.
Пол

Ответы:

16

Добавьте два вместе, они просто списки.

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

Для устранения дубликатов:

FCS = set(arcpy.ListFeatureClasses("X_*") + arcpy.ListFeatureClasses("*_Y"))
Джейсон Шайрер
источник
Это работает также, спасибо @Jason Sheirer, использование мне начинается с и заканчивается в файле GDB. Когда я изменил сценарий, который использовал для работы с SDE, по какой-то причине он не работал. Упомянутый вами метод работает в SDE.
стандарт
6

Вы можете подойти к этому немного по-другому:

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
источник
Это не сработает, если вы не в GDB. Расширение возвращается для шейп-файлов.
Пол
Это должно работать для любого класса объектов в вашем рабочем пространстве. Включая шейп-файлы - почему бы не вернуть расширение?
dklassen
Потому что вы не можете использовать подстановочные знаки с этими символами в конце - это то, что OP делает.
Пол
@Paul Modified - спасибо за исправление. Я не видел "_Y" часть.
dklassen
2
Немного придирчив, но ты должен использовать os.path.splitext(). Шейп-файл может иметь точку в имени. +1
Пол
1

Этот сценарий указывает несколько подстановочных знаков в списке cases[]. Затем он зацикливается на уникальных случаях, перечисляя нужные классы пространственных объектов arcpy.ListFeatureClasses (). Каждый выбранный класс пространственных объектов добавляется в новый список классов пространственных объектов с помощью «.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
источник