在arcpy.ListFeatureClasses中使用多个通配符参数


12

我知道必须有一种方法可以做到这一点,但是我很难弄清楚该怎么做。我想创建一个要素类列表以对其执行操作,但是,我希望该列表包含要素类,这些要素类具有2个单独且不同的文件名标识符。代码如下所示:

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

我知道OR是不正确的,但是有某种方法可以执行此操作而不必重新编写代码以使用第二个通配符。感谢您帮助痛风,我知道Select By Attributes中有一个选择方法,该方法允许使用OR语句使用多个通配符。


通配符参数仅将字符串作为输入,因此要运行ListFeatureClasses()两次(对于大型目录而言可能会太慢,最好不传递通配符,然后仅对结果进行过滤。)
Paul

Paul,这正是下面的列表理解答案所要做的-它遍历列表并根据if语句对其进行过滤。
dklassen 2014年

@ dklassen,OP正在寻找以“ _Y”结尾而不是开始的FC。您可以对GDB使用通配符,但对代码不可以使用shapefile。
Paul

Answers:


16

将两者加在一起,它们只是列表。

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

要消除重复项:

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

感谢@Jason Sheirer,这也可以使用,在文件GDB中使用startswith和endswith对我有效。当我更改用于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')]

除非您在GDB中,否则这实际上不会起作用。将为shapefile返回扩展名。
保罗

这应该适用于您设置的工作空间中的任何要素类。包括shapefile-为什么我们不希望返回扩展名?
dklassen 2014年

因为您不能对此使用通配符来结尾字符-这就是OP看起来要做的事情。
Paul

@Paul修改-感谢您的纠正。我没有看到“ _Y”部分。
dklassen 2014年

2
有点挑剔,但您应该使用os.path.splitext()。shapefile的名称中可能带有句点。+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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.