import arcgisscripting, os
gp = arcgisscripting.create(9.3)
gp.workspace = 'd:\scratch.gdb'
fcs = gp.ListFeatureClasses()
for fc in fcs:
print fc
请指明您的答案适用于哪个ArcGIS Desktop版本(我正在寻找9.3,但我们最好将所有版本收集在一个地方。)
#1 楼
此arcgis10例程返回gdb内部的所有fcs(独立或要素数据集)。只需设置arcpy.env.workspace,然后进行for循环
def listFcsInGDB():
''' set your arcpy.env.workspace to a gdb before calling '''
for fds in arcpy.ListDatasets('','feature') + ['']:
for fc in arcpy.ListFeatureClasses('','',fds):
yield os.path.join(arcpy.env.workspace, fds, fc)
评论
干净整洁!
–乍得·库珀
2011年2月8日在19:10
谢谢gotchula!那是我第一次遇到yield语句,不得不做一些阅读才能弄清楚。您忘了注意您的示例适用于arcgis v10。
–马特·威尔基
2011-2-8 22:28
抱歉,是的,这是10.x版本。是的,产量很高,可以生成干净的代码。
–gotchula
2011-2-8 23:09
谢谢gotchula,我知道这是一篇老文章,但是我发现这对于管理每周添加的数据库非常有帮助。我可以问一下第三行中的+ ['']做什么吗?
–迪伦·沃伯格(Dylan Warburg)
18年1月22日在19:09
我在arcpy.ListDatasets循环内调用arcpy.ListFeatureClasses。我需要包括不在任何要素数据集中(也称为独立要素类)的要素类,因此我将''添加到数据集列表中,这导致ListFeatureClasses以''作为fds变量被调用。
–gotchula
18年2月27日在22:51
#2 楼
我最终使用了gotchula的答案,但是没有收益,因为我通常会重复使用创建的FC句柄,并且一旦产生收益后就将其丢弃,那么与fcs.append()
相比,我更容易阅读和理解fcs = yield(...)
的功能。def listFcsInGDB(gdb):
''' list all Feature Classes in a geodatabase, including inside Feature Datasets '''
arcpy.env.workspace = gdb
print 'Processing ', arcpy.env.workspace
fcs = []
for fds in arcpy.ListDatasets('','feature') + ['']:
for fc in arcpy.ListFeatureClasses('','',fds):
#yield os.path.join(fds, fc)
fcs.append(os.path.join(fds, fc))
return fcs
gdb = sys.argv [1]
fcs = listFcsInGDB(gdb)
for fc in fcs:
print fc
结果:
d:\> python list-all-fc.py r:\v5\YT_Canvec.gdb
Processing r:\v5\YT_Canvec.gdb
Buildings_and_structures\BS_2530009_0
Buildings_and_structures\BS_2380009_2
Buildings_and_structures\Tower
Buildings_and_structures\Underground_reservoir
...
这现在在我称为arcplus *的模块中。与其他代码或PYTHONPATH一起放置,然后:
import arcplus
fcs = arcplus.listAllFeatureClasses('d:\default.gdb')
for fc in fcs:
print "magic happens with: ", fc
Arcplus还添加了通配符过滤;现在只能在Github上处理包含“ Hydro”的要素数据集中以“ HD_”开头的要素类。
fcs = arcplus.listAllFeatureClasses(gdb, fd_filter='*Hydro*', fc_filter='HD_*')
。*已在Github上进行了升级,已升级为10.x。对于arcgis 9.3,请参见此处。
评论
我不确定我在这里避免使用yield的基本原理。首先,您所指的“句柄”根本不是句柄,它们只是字符串。而且,如果您打算保留要素类列表进行多次迭代,则仍可以将其作为生成器函数保留并“列出”它:my_list = list(generator_function(args))这将评估生成器并存储结果在列表变量中。
–blah238
2014年5月22日19:39
@ blah238:哦。我想那时候我还是不屈服。我知道像fcs = fcs.append(...)这样的语句比fcs = list(yield(...))快得多。
–马特·威尔基
2014年5月26日18:07
#3 楼
我意识到这个问题被标记为9.3,但是从10.1起寻找相同答案的人最好使用arcpy.da.Walk。它比ListDatasets / FeatureClasses / Rasters / etc更快,更准确。它遍历给定路径中的目录,并且在每次迭代时,root代表目录的完整路径,而dirs和datasets是其中包含的子目录和文件的列表。遍历地理数据库时,要素数据集的处理方式与目录相同。如果只想在根文件夹中列出数据集和要素数据集,而又不想打开要素数据集以查看其内容,则可以执行以下操作:
import arcpy
import os
for root, dirs, datasets in arcpy.da.Walk('d:\scratch.gdb'):
for ds in datasets:
print os.path.join(root, ds)
评论
我会更快一点。您可以扩展“更准确”吗?谢谢。
–马特·威尔基
16年5月13日在17:56
ListDatasets,ListFeatureClasses等并不总是返回正确的数据集。此外,您在SDE和文件GDB之间会得到不同的结果。我不记得确切的问题,但是我们停止使用arcpy.List ...,因为我们不信任结果。
– jon_two
16年5月16日在12:13
#4 楼
我认为您正在寻找ListDatasets
方法。该FGDB包含一个称为“ Wells”的FD,并且其中包含3个FC。对于9.3.1:C:\WINDOWS\system32>python
Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import arcgisscripting
>>> gp=arcgisscripting.create(9.3)
>>> d='c:\data\Third_Party_Wells_PRD.gdb'
>>> gp.workspace = d
>>>
>>> fds=gp.ListDatasets('','Feature')
>>> for fd in fds:
... print fd
...
Wells
>>> for fd in fds:
... gp.workspace=d + '/' + fd
... fcs=gp.ListFeatureClasses()
... for fc in fcs:
... print fc
...
Third_Party_Wells_BHL
Third_Party_Wells_LAT
Third_Party_Wells_SHL
>>>
评论
一个相关但最新的问答(包括使用arcpy.da.Walk)是如何制作GIS库存?另请参阅:如何在“多个文件夹”中列出多个地理数据库的要素类?