我正在尝试遍历多个目录和多个GDB,以创建一个要素类列表。我遇到的问题是,当我试图从列表中删除某些要素类时,脚本只是被忽略了,或者我得到了一个错误,说明列表中不存在x。(X)。要素类名称的问题是,它有3个字母,对于每个GDB是唯一的,同时仍然有2个其他标准组件。
如下所示:
directory1 > directory1.gdb > shapes > fc_dir1_feature
&
directory2 > directory2.gdb > shapes > 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中删除要素数据集,并扩展到其中的所有要素类。但我不能仅删除特定的要素类。
谢谢你的帮助。
发布于 2013-05-24 00:06:27
假设arcpy.da.Walk的工作方式与os.walk类似(也就是说,从dirname中删除目录会停止遍历该目录),您应该添加另一个for循环来迭代dirname并应用您的过滤器。请注意,我复制了dirname,这样我就可以调用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))
https://stackoverflow.com/questions/16714991
复制相似问题