In a folder I have a group of file geodatabases that have unique names from one another. Within each geodatabase is a polyline feature class that is not uniquely named - they are all called 'Elev_Contour'. I want to use Python to iterate through the geodatabases and append the geodatabase name onto the end of the feature class names to make them unique. After that is complete, I want to copy the feature classes into one new geodatabase.

I've used da.walk to build a list of all the feature classes, but I am struggling with how to access just the geodatabase name when iteratively renaming the feature classes.

import os
import arcpy
from arcpy import env
env.workspace = r"b:\contours"
fclist = []
for dirpath, dirnames, filenames in arcpy.da.Walk(env.workspace,datatype="FeatureClass"):
    for filename in filenames:
        fclist.append(os.path.join(dirpath, filename))

for fc in fclist:
    print fc
  • You could use string slicing: fc[11:-14]
    – BERA
    Dec 1, 2016 at 17:49

2 Answers 2


Rather than using string indexing as suggested by @Bryce Frank, I would suggest using a potentially more stable approach and using the native python string function of .split in combination with the python os module value of os.sep and os.path.splitext to remove the .gdb file extension.

Because the position, eg index of your gdb name portion of your split path, remains the same you can use this index value to retrieve the gdb name like this:

gdb_name_index = 2
for fc in fclist:
    gdb_name = os.path.splitext(fc.split(os.sep)[gdb_name_index])[0]
    updated_fc_name = fc + gdb_name 

updated_fc_name can then be used in an operation to copy the feature class to the new geodatabase.

You could further generalize the process and create a function that gets the index of the file geodatabase portion of the file path. Like this:

def get_gdb_path_component_index(in_path):
    gdb_index = None
    in_path_components = in_path.split(os.sep)    
    for component in in_path_components:
        if '.gdb' in component:
            gdb_index = in_path_components.index(component)
    return gdb_index

Because a geodatabase cannot be inside a geodatabase this should be safe. However you would have to check the return variable gdb_index for the value of None before using it.

Putting this all together you would end up with a more generalized workflow like this:

for fc in fclist:
    gdb_name_index = get_gdb_path_component_index(fc)
    if gdb_name_index != None:
         gdb_name = os.path.splitext(fc.split(os.sep)[gdb_name_index])[0]
         updated_fc_name = fc + gdb_name
  • 2
    +1 agree, this is a more stable method
    – artwork21
    Dec 1, 2016 at 21:00
  • 1
    os.path.dirname(os.path.dirname(x)) might be simpler to understand at first glance.
    – Paul
    Dec 1, 2016 at 21:32

You could trim each of these strings if you just want to return a string of the geodatabase name. This works because each is surrounded by a constant number of characters.

This is an example of how to do one, I'll let you incorporate it into your for loop.

str1 = r"b:\contours\Elev_321168_Albany_E_1X1.gdb\Elevation\Elev_Contour"
str1 = str1[12:-23]
print str1
  • 1
    While this might work in practice, string slicing on paths is not a good idea.
    – Paul
    Dec 1, 2016 at 21:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.