循环遍历dirnames list.remove()不起作用

时间:2013-05-23 13:18:03

标签: python arcgis arcmap

我正在尝试遍历多个目录和多个GDB以创建要素类列表。我遇到的问题是,当我尝试从列表中删除某些要素类时,脚本被忽略或者我得到一个错误,表示列表中不存在x。(x)。要素类名称的问题在于它具有3个字母,这些字母对于每个GDB是唯一的,同时还有2个其他标准组件。

这样的事情:

directory1> directory1.gdb>形状> fc_dir1_feature

&安培;

directory2> directory2.gdb>形状> fc_dir2_feature

依旧......

我正在使用

for dirpath, dirnames, filenames in arcpy.da.Walk(in_workspace, datatype="FeatureClass",type="Polygon"):
if "dir1" in dirnames:
    dirnames.remove('dir1')

可以很好地从GDB中删除要素数据集,并扩展其中的所有要素类。但我无法删除特定的要素类。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

假设arcpy.da.Walk像os.walk一样工作(也就是说,从dirnames中删除一个目录停止走到那个目录)你应该添加另一个for循环来迭代dirnames并应用你的过滤器。请注意,我复制了dirnames,以便我可以调用remove而不会弄乱迭代器。

for dirpath, dirnames, filenames in arcpy.da.Walk(in_workspace, datatype="FeatureClass",type="Polygon"):
    # remove subdirectories that match pattern so they will not be walked
    for dirname in dirnames[:]:
        if 'dir1' in dirname:
            dirnames.remove(dirname)

来自ArcGIS Resources,您可以使用正则表达式以多种不同方式过滤文件名。以下是正则表达式的示例,用于删除通配符插槽中包含“abc”,“def”或“ghi”的文件:

import arcpy
import os
import re

workspace = "c:/data"
feature_classes = []

# i dont like abc, def or ghi features so I have a regex to match them
filter_classes_re = re.compile('fc_(abc|def|ghi)_feature$')

for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,
                                                  datatype="FeatureClass",
                                                  type="Polygon"):
    for filename in filenames:
        # only add to feature list if it doesn't match the bad guys
        if filter_classes_re.match(filename) is None:
            feature_classes.append(os.path.join(dirpath, filename))


# alternately, i could extract the wildcard part and compare it outside
# of the regex ... but this will be slower

filter_classes_re = re.compile('fc_(.*?)_feature$')

for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,
                                                  datatype="FeatureClass",
                                                  type="Polygon"):
    for filename in filenames:
        # extract the wildcard part
        match = filter_classes_re.match(filename)
        if match:
            matched = match.group(1)
        else:
            matched = ''
        if matched not in ('abc', 'def', 'ghi'):
            feature_classes.append(os.path.join(dirpath, filename))