I have 22 geodatabases all in one folder. Each gdb has two feature classes. For each feature class, I need to rename a few of the fields. I've had success with this code, but it only works for each GDB at a time:
import arcpy
from arcpy import env
env.workspace = r'C:\...\filename.GDB'
for fc in arcpy.ListFeatureClasses('*'):
try:
arcpy.AlterField_management(fc, 'ADDR_SN', 'STREET_NAME', 'STREET_NAME')
except:
pass
As I said, that code is just for one GDB at a time, so I'd have to change the name in env.workspace each time. That's not a big deal, I just want to see if it's possible to iterate through every GDB in the folder. So I tried adding into the code:
for workspace in arcpy.ListWorkspaces('*', 'All'):
When I add the above code, I also change the env.workspace to the folder name that contains all the geodatabases, but nothing happens. No error is returned, nothing happens.
-
1Welcome to GIS SE! As a new user be sure to take the Tour where you will see that only one question should be asked per question. I recommend that you use the edit button beneath your question to edit the second one out. Also, you have posted some code and then mentioned that you edited it but what we really need to see is precisely what you ran when you were stuck and any errors thrown. While you are testing and want to see all errors I suggest removing your try/except.PolyGeo– PolyGeo ♦2015年03月25日 22:55:40 +00:00Commented Mar 25, 2015 at 22:55
-
Ok sorry about that. I figured out the array thing on my own. I still would like to know how to iterate through all GDB though. Here's the working array code: import arcpy from arcpy import env env.workspace = r'C:\....\filename.GDB' ... oldfields = ['old_name1', ..., 'old_nameN'] ... newfields = ['new_name1, ..., 'new_nameN'] for fc in arcpy.ListFeatureClasses('*'): ... for i in range(len(oldfields)): try: arcpy.AlterField_management(fc, oldfields[i], newfields[i], newfields[i]) except: passKrewe Chief– Krewe Chief2015年03月26日 13:17:40 +00:00Commented Mar 26, 2015 at 13:17
-
1Would you be able to specify the version of ArcGIS for Desktop that you are using, please? For the question you are now asking it is likely to make a big difference.PolyGeo– PolyGeo ♦2015年03月26日 19:49:30 +00:00Commented Mar 26, 2015 at 19:49
-
Yes I'm using 10.3. I'm doing this in ArcCatalog, but I doubt that makes a difference.Krewe Chief– Krewe Chief2015年03月26日 19:56:14 +00:00Commented Mar 26, 2015 at 19:56
1 Answer 1
So ESRI has arcpy versions of some common operations from the os module, especially when it comes to listing directories. I have not used arcpy.ListWorkspaces()
before, but it seems like it should work for you, and you could add arcpy.ListWorkspaces("*","FileGDB")
because you are specifically looking for File Geodatabases. Generally it's good practice to use arcpy functions when dealing with ESRI data, but in some cases like this it is not necessary.
EDIT: As @polygeo mentioned below, the best thing to use is arcpy.da.walk()
if you're using ArcGIS 10.1+. Here's more information. The rest of my answer below uses the os.walk()
function: workable, but not the best.
The os module alternative would be to use os.walk
. This is a super useful function for everywhere so it's good to be familiar with it. Here's documentation.
For your use, it could be something like this:
import os
import arcpy
from arcpy import env
topdir = r"path/to/folder/containing/all/gdbs"
for path, dirs, files in os.walk(topdir):
# iterate through all the directories
for d in dirs:
#skip directories that are not geodatabases
if not d.lower().endswith(".gdb"):
continue
# now you know you are looking at a directory that is a gdb
env.workspace = os.path.join(path,d)
print env.workspace #just to double check
for fc in arcpy.ListFeatureClasses():
etc.
Note: Once you are "in" a file geodatabase, the os module is not useful, because although the geodatabase can (more or less) be treated as a normal directory, the individual files inside of it are not recognizable as spatial data unless you access them with the arcpy module. For example, if you have a feature class called "roads", os.path.isfile(r"c:\geodatabase.gdb\roads") == False
because no file actually exists called roads.
-
3Rather than os.walk I recommend arcpy.da.Walk because it is able to walk inside geodatabases.2015年03月26日 19:59:29 +00:00Commented Mar 26, 2015 at 19:59
-
aha, yes, I'd agree, thanks. I forgot about that function.mr.adam– mr.adam2015年03月26日 20:35:46 +00:00Commented Mar 26, 2015 at 20:35