3

I would like to check in one geodatabase and list the feature classes that are in it; check another geodatabsae for the list of feature classes, if they do not exist in the 2nd geodatabase then execute feature class to feature class. If one does then just skip. How can this be done with Python? Here is what I have so far. After I get my list how can I use arcpy.Exists to check another .gdb from my list, and if an element in the list does appear in that .gdb then skip it, however if it does not, then execute the function?

>>> import arcpy
... from arcpy import env
... import os
... 
... # Set the workspace for the ListFeatureClass function
... #
... env.workspace = r'C:\GIS_Data\MXDs\ServerMxdsR\working\gis_dev01.gdb'
... 
... # Use the ListFeatureClasses function to return a list of 
... # shapefiles.
... #
... fcList = arcpy.ListFeatureClasses()
asked May 18, 2016 at 18:46
4
  • To clarify: in gdb 1, list all FCs. If 1 FC exists in gdb 2 don't copy. If none of the FCS from gdb 1 exist in gdb 2 then copy? Commented May 18, 2016 at 18:57
  • that is correct Commented May 18, 2016 at 18:58
  • I didn't see these comments when I wrote my answer. My code copies any FC that is missing, but if you only want them copied if ALL are missing it'll need to be slightly different. I'll update my answer Commented May 18, 2016 at 20:13
  • 2
    Just putting in my 2 cents here. But just blindly copying a feature class from one gdb to another may be problematic. One gdb might have a fc called "Roads" with 2 roads in it. The other might have one called "Roads" with 10,000 roads in it. Just looking at the name means it won't copy even though it has a more complete list of roads. This might be irrelevant for your workflow, but I just wanted to point out that you're not actually comparing data. Just feature class names. Commented May 18, 2016 at 22:32

2 Answers 2

6

You want to try something like this

# Use the ListFeatureClasses function to return a list of 
# shapefiles.
fcList = arcpy.ListFeatureClasses()
gdb2 = r'C:\GIS_Data\MXDs\ServerMxdsR\working\gis_dev02.gdb' # Your second geodatabase
for fc in fcList:
 secondFC = os.path.join(gdb2, fc)
 if arcpy.Exists(secondFC):
 print "{} exists, not copying".format(fc)
 else:
 arcpy.FeatureClassToFeatureClass_conversion(fc, gdb2, fc) # Copies feature class from first gdb to second gdb

Loops through your feature classes from your fcList, checks if they exist in your second gdb, and if they don't it performs arcpy.FeatureClassToFeatureClass_conversion to copy from gdb 1 to gdb 2.


To only copy feature classes if none of them exist in gdb 2, try this:

# Use the ListFeatureClasses function to return a list of 
# shapefiles.
fcList = arcpy.ListFeatureClasses()
gdb2 = r'C:\GIS_Data\MXDs\ServerMxdsR\working\gis_dev02.gdb' # Your second geodatabase
anyFCExists = 0
for fc in fcList:
 secondFC = os.path.join(gdb2, fc)
 if arcpy.Exists(secondFC):
 anyFCExists = 1
 break
if not anyFCExists:
 for fc in fcList:
 secondFC = os.path.join(gdb2, fc)
 arcpy.FeatureClassToFeatureClass_conversion(fc, gdb2, fc) # Copies feature class from first gdb to second gdb
else:
 print "One of the feature classes already exists, so not copying any"

This loops through all feature classes, and if it finds any already exist, then it sets the anyFCExists flag. Then if the anyFCExists flag is not set then it loops through the feature classes and copies them all across.

answered May 18, 2016 at 19:40
1
  • 1
    so many arcpy functions that I don't know. arcpy.exists just helped a ton of my programs. Commented Jul 19, 2019 at 14:53
4

Try this, using the while loop will continue to loop until the condition is false. The code below will look for if the FC exists, if it doesn't, it will copy them all over.

import arcpy
import os
gdb1 = r"C:\Users\gb1.gdb"
gdb2 = r"C:\Users\New File Geodatabase.gdb"
walk = arcpy.da.Walk(gdb1,"FeatureClass")
walk2 = arcpy.da.Walk(gdb2,"FeatureClass")
#list all FC in gdb1
for dirpath, dirnames, filenames in walk:
 for fc in filenames:
 print fc
 fc1 = os.path.join(gdb1,fc)
 fc2 = os.path.join(gdb2,fc)
 while arcpy.Exists(fc2):
 print "FC exists in gdb2"
 break
 else:
 print "Doesn't exist"
 arcpy.FeatureClassToFeatureClass_conversion(fc1, gdb2, fc)

This one should work for finding one FC in the other GDB, if it exists, nothing will be copied:

import arcpy
import os
gdb1 = r"C:\Users\gdb1.gdb"
gdb2 = r"C:\Users\New File Geodatabase.gdb"
walk = arcpy.da.Walk(gdb1,"FeatureClass")
#list all FC in gdb1
c = 0
for dirpath, dirnames, filenames in walk:
 for fc in filenames:
 print fc
 fc1 = os.path.join(gdb1,fc)
 fc2 = os.path.join(gdb2,fc) 
 print c
 if arcpy.Exists(fc2):
 c=+1
 print fc + "path does exist" 
 else:
 print "does not exist" 
 if c<1:
 arcpy.FeatureClassToFeatureClass_conversion(fc1, gdb2, fc)
answered May 18, 2016 at 20:15

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.