我有一个脚本,它列出了SDE数据库中的要素类和字段。python模块arcplus创建要素类列表:
#Create list of feature classes on ArcSDE
mylist = arcplus.listAllFeatureClasses("Database Connections\\Connection to oracle.sde")
而函数arcpy.ListFields为每个要素类创建一个字段列表。
#dictionary of featureclasses and fields
ns_dict = dict([(list_entry, [f.name for f in arcpy.ListFields(list_entry)])for list_entry in mylist])
这非常有效,除非我对特定要素类的字段没有读取访问权限。然后,它返回类似如下的内容:
IOError: "Database Connections\Connection to oracle.sde\POLITICAL.LANDS\POLITICAL.DISTRICT_LANDS" does not exist
对于每个"IOError某些要素类不存在“的实例,我要跳到my_list中的下一个要素类。我还没有找到可以使用它的try/except代码块。或者,也许完全不同的东西更合适?
发布于 2014-08-05 10:28:59
如果arcpy.ListFields(...)
抛出一个异常,它显然会杀死整个列表/字典理解。你需要把它包装在可以处理它的东西周围,才能返回你想要的东西。我会尝试像这样的东西
def list_fields(list_entry):
try:
return arcpy.ListFields(list_entry)
except IOError:
return []
那么字典结构看起来就像这样
# dictionary of featureclasses and fields
ns_dict = dict(
((list_entry, [f.name for f in list_fields(list_entry)])
for list_entry in mylist)
)
注意,我已经将您的列表理解更改为生成器表达式,以节省内存和执行时间。如果你的python >2.7,你也可以使用字典理解,看起来像这样:
ns_dict = {
list_entry: [f.name for f in list_fields(list_entry)]
for list_entry in mylist)
)
https://stackoverflow.com/questions/25130023
复制相似问题