I would like to count the number of feature classes in a geodatabase. Some of the classes are in feature datasets as well. I have tried get count management, but that returns the number of rows in each feature class in the GDB.
3 Answers
The arcpy.da.Walk() method is the way to go:
import arcpy, os
workspace = r"C:\Users\OWNER\Documents\ArcGIS\Default.gdb"
feature_classes = []
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace,
datatype="FeatureClass",
type="Any"):
for filename in filenames:
feature_classes.append(os.path.join(dirpath, filename))
print "There are %s featureclasses in the workspace" % len(feature_classes)
The main operators here are arcpy.da.Walk
and len()
. arcpy.da.Walk
simply walks through folders and subfolders and collects files of datatype="FeatureClass"
using feature_classes.append(os.path.join(dirpath, filename))
. Finally, len()
is used to count the number of files in the feature_classes = []
list.
EDIT:
From a benchmark standpoint and in the interest of science, it appears that arcpy.da.Walk method is significantly faster than the other approach. I tested them on a FGDB with 7 FDS and 35 FC's. Here are the results:
import arcpy, os, time
###########################################################################
# METHOD 1
start = time.clock()
workspace = r"C:\Users\OWNER\Documents\ArcGIS\Default.gdb"
feature_classes = []
for dirpath, dirnames, filenames in arcpy.da.Walk(workspace, datatype="FeatureClass", type="Any"):
for filename in filenames:
feature_classes.append(os.path.join(dirpath, filename))
print "There are %s featureclasses in the workspace" % len(feature_classes)
end = time.clock()
method1 = (end - start)
############################################################################
# Method 2
start = time.clock()
arcpy.env.workspace = r"C:\Users\OWNER\Documents\ArcGIS\Default.gdb"
# Get stand alone FCs
fccount = len(arcpy.ListFeatureClasses("",""))
# Get list of Feature Datasets and loop through them
fds = arcpy.ListDatasets("","")
for fd in fds:
oldws = arcpy.env.workspace
arcpy.env.workspace = oldws + "\\" + fd
fccount = fccount + len(arcpy.ListFeatureClasses("",""))
arcpy.env.workspace = oldws
print fccount
end = time.clock()
method2 = (end - start)
##########################################################################
print 'method1 completed in %s seconds; method2 completed in %s seconds' % (method1, method2)
-
1That is great Aaron, I was un-aware of Arcpy.da.Walk method - but I don't have 10.1 installed yet, so I don't have access to it. For now, I am going to have to stick with my old method, but when I upgrade - I will remember to implement your method!– dklassenCommented Feb 13, 2014 at 19:53
-
arcpy.da.Walk is a huge improvement on arcpy.ListDatasets, but can still be slow if you have thousands of datasets in your GDB. Does anyone know of a faster way? Also, some weird things going on with scope - dirnames and filenames are still accessible outside the loop. It's handy, but probably shouldn't be happening!– jon_twoCommented Mar 24, 2016 at 12:29
You can run this code to get it:
arcpy.env.workspace = NAME OF GDB HERE
# Get stand alone FCs
fccount = len(arcpy.ListFeatureClasses("",""))
# Get list of Feature Datasets and loop through them
fds = arcpy.ListDatasets("","")
for fd in fds:
oldws = arcpy.env.workspace
arcpy.env.workspace = oldws + "\\" + fd
fccount = fccount + len(arcpy.ListFeatureClasses("",""))
arcpy.env.workspace = oldws
print fccount
Hope this works for you.
If you select all the feature classes in the gdb and copy them to a new location, it will give you the status of the transfer - x amount of (total) object classes transferred. Then you just cancel the transfer.