3

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.

PolyGeo
  • 65,136
  • 29
  • 109
  • 338
Geoffrey West
  • 2,548
  • 6
  • 28
  • 49

3 Answers3

14

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)

enter image description here

Aaron
  • 51,658
  • 28
  • 154
  • 317
  • 1
    That 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! – dklassen Feb 13 '14 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_two Mar 24 '16 at 12:29
10

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.

dklassen
  • 2,920
  • 15
  • 25
-2

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.

Scott
  • 1