Ever wanted to execute a function on all the tables and/or featureclasses in a workspace then the following code is something for you. What it basically does is first loop over all the featureclasses that are in featuredatasets. Then loop over all the other featureclasses and finally loop over all the tables in the provided workspace.
To achieve this and still be able to retrieve the result of each function execution on the tables and featureclasses I created a generator function. I did this by using the yield statement. In order to avoid duplicate code I also created a nested function for looping over the featureclasses.
def executeiter(gp, workspace, featclassfunction=None, tablefunction=None): import os def loopfcs(): fcs = gp.listfeatureclasses() for fc in iter(fcs.next, None): yield featclassfunction(fc) gp.workspace = workspace if featclassfunction is not None: for dataset in iter(gp.listdatasets().next, None): datasetworkspace = os.path.join(workspace, dataset) gp.workspace = datasetworkspace for result in loopfcs(): yield result gp.workspace = workspace for result in loopfcs(): yield result if tablefunction is not None: tables = gp.listtables() for table in iter(tables.next, None): yield tablefunction(table)
If you don't need the result of the function you can call the following function. It takes the same arguments as the executeiter function but its a regular function instead of a generator.
def execute(gp, workspace, featclassfunction=str, tablefunction=str): for x in executeiter(workspace, featclassfunction, tablefunction): pass
To demonstrate the usage of my code I first initialized a geoprocessing object and a workspace variable. Then I used the executeiter method to make it return the uppercase version of the name of the tables and featureclasses in my workspace. I could also have passed for example the describe or the listfields method of the geoprocessing object or a custom function. When you want to pass a function that doesn't return a result like the deleterows or deletefeatures function its more convenient to call the execute function.
import arcgisscripting, string gp = arcgisscripting.create() workspace = r'D:\temp\temp.gdb' # path to your workspace # print the uppercase names of all the tables and featureclasses for uppername in executeiter(gp, workspace, string.upper, string.upper): print uppername # delete all rows of all the tables and featureclasses execute(gp, workspace, gp.deletefeatures, gp.deleterows)
I've come to the end of this post. Did I miss something ? Know a Python idiom I really should start using ? Feel free to comment.