This tool outputs a table that lists record counts for each table and feature class found in the input workspace tree. The script walks through subdirectories to discover items. The tool searches for tables and feature classes within all folders and geodatabases, including feature datasets.
Data types supported are shapefiles, stand-alone tables, Excel spreadsheets, and all levels of ESRI geodatabases.
Note that Excel spreadsheet record counts may be approximate because of ArcGIS limitations. Also, only single-table tabs and named ranges are supported. Table objects are not supported.
The output table contains the following columns:
Class_Name (unqualified feature class or table name)
Data_Type (data type per Describe)
Record_Count (table record count)
Path (Path + Table_Name = valid path)
Table_Name (fully-qualified feature class or table name)
This tool provides a quick record count of data present in a workspace tree, so is useful in the discovery phase of projects. It can also be used in scripting to provide paths on selected records, as the Path + Table_Name can be concatenated to create complete catalog paths.
Illustration
Usage
There is no usage for this tool.
Syntax
WorkspaceRowCounts_mytools (Input_Workspace, Output_Workspace, Output_Table_Name)
| Parameter | Explanation | Data Type |
|---|---|---|
| Input_Workspace |
Dialog Reference Top of workspace tree to search ___________________ Python Reference Top of workspace tree to search |
Workspace |
| Output_Workspace |
Dialog Reference Output workspace ___________________ Python Reference Output workspace |
Workspace |
| Output_Table_Name |
Dialog Reference output table name ___________________ Python Reference Output workspace |
String |
Code Samples
ListRecordCounts.py
This is the source code for this tool.
import arcpy, traceback, sys, os
arcpy.env.overwriteOutput = True
def add_fields(Input_Layer, field_name_list):
'''Quick, hard-coded way to add fields to a table,
example below shows one way to manage field names for easier coding.
Create the field name list in your main code, then paste below for reference.
# NAMES FOR FIELDS TO ADD
# 0 1 2 3 4
tableheaders = ["Class_Name", "Data_Type", "Record_Count", "Path", "Table_Name"]
Create table syntax: CreateTable_management (out_path, out_name, {template}, {config_keyword})
'''
# CREATE VALUE TABLE FOR FIELDS TO ADD
# ADDROW FORMAT: Name Type Length - Length is optional
vtab = arcpy.ValueTable(3)
vtab.addRow(field_name_list[0] + " Text 100")
vtab.addRow(field_name_list[1] + " Text 15")
vtab.addRow(field_name_list[2] + " Long")
vtab.addRow(field_name_list[3] + " Text 255")
vtab.addRow(field_name_list[4] + " Text 100")
x = 0
# LOOP THROUGH THE VALUE TABLE
while x < vtab.rowCount:
if (vtab.getValue(x, 1) == "Text"):
arcpy.AddField_management(Input_Layer, vtab.getValue(x, 0), vtab.getValue(x, 1), field_length=(int(vtab.getValue(x, 2))))
else:
arcpy.AddField_management(Input_Layer, vtab.getValue(x, 0), vtab.getValue(x, 1))
arcpy.AddMessage(" Added field " + vtab.getValue(x, 0) + ".")
x += 1
def insert_rows(in_layer, field_list, rows_to_insert):
# inserts a python list of lists containing comma-delimited rows of data to insert.
# Parameters: layer to insert rows into, list of field name strings, data rows.
cursor = arcpy.da.InsertCursor(in_layer, field_list)
for row in rows_to_insert:
cursor.insertRow(row)
del cursor
if __name__ == "__main__":
in_workspace = arcpy.GetParameterAsText(0) # Workspace
out_workspace = arcpy.GetParameterAsText(1) # Workspace
out_table_name = arcpy.GetParameterAsText(2) # String
try:
arcpy.AddMessage(" ")
# CREATE OUTPUT TABLE
out_table = arcpy.CreateTable_management (out_workspace, out_table_name)
# CREATE THE COLUMN HEADINGS LIST
# 0 1 2 3 4
tableheaders = ["Class_Name", "Data_Type", "Record_Count", "Path", "Table_Name"]
# ADD THE COLUMN HEADINGS TO THE OUTPUT TABLE
add_fields(out_table, tableheaders)
arcpy.env.workspace = in_workspace
nullvalues = ["", " ", None, 0]
# COLLECT FEATURE CLASSES AND TABLES FROM WORKSPACE TREE
feature_classes = []
walk = arcpy.da.Walk(in_workspace, datatype=['FeatureClass', 'Table'])
for dirpath, dirnames, filenames in walk:
for filename in filenames:
feature_classes.append(os.path.join(dirpath, filename))
if len(feature_classes) > 0:
arcpy.AddMessage(" Compiling row counts ...")
rows_to_add = []
this_line = []
# ITERATE THROUGH FEATURE CLASSES AND TABLES
for fc_path in feature_classes:
arcpy.AddMessage(" " + str(fc_path))
try:
desc = arcpy.Describe(fc_path)
lfields=arcpy.ListFields(fc_path)
class_name = desc.baseName
if len(class_name.split(".")) > 1: # USE UNQUALIFIED TABLE NAME
class_name = class_name.split(".")[int(len(class_name.split("."))-1)]
# IF THIS IS AN EXCEL TABLE ...
if class_name[-2:] == "$'" or class_name[-1:] == "$" or desc.path[-4:] in [".xls", "xlsx"]:
class_name = class_name.strip("'")
high_num = 0
rowCount = 0
this_line = []
for i, f in enumerate(lfields):
# GET RECORD COUNT FROM COLUMN WITH HIGHEST NUMBER OF POPULATED ROWS
rowCount = 0
with arcpy.da.SearchCursor(fc_path, "*") as cur:
for row in cur:
v = row[i]
if not(v in nullvalues):
rowCount += 1
if rowCount > high_num:
high_num = rowCount
if high_num == 0:
continue
else:
this_line.append(class_name)
this_line.append(desc.dataType)
this_line.append(high_num)
this_line.append(desc.path)
this_line.append(class_name)
rows_to_add.append(this_line)
else: # OTHERWISE ...
for f in lfields:
# GET RECORD COUNT FROM OID COLUMNS
if f.type == "OID":
this_line = []
rowCount = 0
with arcpy.da.SearchCursor(fc_path, f.name) as cur:
for row in cur:
v = row[0]
if not(v in nullvalues):
rowCount += 1
# COLLECT DATA TO OUTPUT
this_line.append(class_name)
this_line.append(desc.dataType)
this_line.append(rowCount)
this_line.append(desc.path)
this_line.append(desc.baseName)
rows_to_add.append(this_line)
except:
arcpy.AddMessage("ERROR, skipping...")
continue
# INSERT DATA INTO OUTPUT TABLE
insert_rows(out_table, tableheaders, rows_to_add)
arcpy.AddMessage(" ")
# SET OUTPUT PARAMETER
arcpy.SetParameter(3, out_table)
except:
# PRINT ERROR MESSAGES
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
pymsg = tbinfo + "\n" + str(sys.exc_type)+ ": " + str(sys.exc_value)
arcpy.AddError("Python Messages: " + pymsg + " GP Messages: " + arcpy.GetMessages(2))
finally:
del in_workspace
Tags
fields, table, Walk, Describe, enumerate
Credits
Ruth Bowers, 2016
Use limitations
Tested as script tool in ArcGIS 10.2

No comments:
Post a Comment