我正在尝试遍历多个目录和多个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中删除要素数据集,并扩展其中的所有要素类。但我无法删除特定的要素类。
感谢您的帮助。
答案 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))