Skip to content

Instantly share code, notes, and snippets.

@nickrsan
Last active August 1, 2016 19:09
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nickrsan/da95f7f6bca872693d9a9e038a625d5c to your computer and use it in GitHub Desktop.
Save nickrsan/da95f7f6bca872693d9a9e038a625d5c to your computer and use it in GitHub Desktop.
"""
First, this was written back when I wrote Python a bit more like C - I know it needs some work! But for setting delimiters,
you can do the following:
my_dataset = data_file(r"path_to_data")
my_dataset.delim_open # gives you the opening delimeter
my_dataset.delim_close # gives you the closing delimeter
"""
import logging
delims_open = {'mdb': "[", "sqlite": "\"", 'gdb': "\"", 'shp': "\"", 'in_memory': ""} # a dictionary of field delimiters for use in sql statements.
delims_close = {'mdb': "]", "sqlite": "\"", 'gdb': "\"", 'shp': "\"", 'in_memory': ""} # in one type of field or another. These two are just extension based lookups
processing_log = logging.getLogger("processing_log")
class geospatial_object:
def setup_object(self):
'''like __init__ but won't be overridden by subclasses'''
if 'setup_run' in self.__dict__: # check if we have this key in a safe way
if self.setup_run is True: # have we already run this function
return # don't run it again
self.setup_run = True
self.gdb = None
self.temp_folder = None
self.temp_gdb = None
def check_temp(self):
self.setup_object()
if not self.temp_folder or not self.temp_gdb:
try:
self.temp_folder = tempfile.mkdtemp()
temp_gdb = os.path.join(self.temp_folder,"join_temp.gdb")
if arcpy.Exists(temp_gdb):
self.temp_gdb = temp_gdb
else: # doesn't exist
if 'log' in sys.modules:
processing_log.info("Creating %s" % temp_gdb)
arcpy.CreateFileGDB_management(self.temp_folder,"join_temp.gdb")
self.temp_gdb = temp_gdb
except:
return False
return True
def get_temp_folder(self):
self.setup_object()
if self.check_temp():
return self.temp_folder
else:
raise IOError("Couldn't create temp folder")
def get_temp_gdb(self):
self.setup_object()
if self.check_temp():
return self.temp_gdb
else:
raise IOError("Couldn't create temp gdb or folder")
class data_file(geospatial_object):
def __init__(self,filename = None):
self.data_location = filename
self.delim_open = None
self.delim_close = None
def set_delimiters(self):
processing_log.info("Setting delimiters",)
try:
fc_info = arcpy.ParseTableName(self.data_location)
database, owner, featureclass = fc_info.split(",")
except:
processing_log.error("Failed to assess data format")
return False
processing_log.info("Type from ParseTableName = %s" % featureclass)
if re.match(" mdb",featureclass) is not None or re.search("\.mdb",featureclass) is not None:
self.delim_open = delims_open['mdb']
self.delim_close = delims_close['mdb']
elif re.match(" gdb",featureclass) is not None or re.search("\.gdb",featureclass) is not None:
self.delim_open = delims_open['gdb']
self.delim_close = delims_close['gdb']
elif re.match(" shp",featureclass) is not None or re.search("\.shp",featureclass) is not None:
self.delim_open = delims_open['shp']
self.delim_close = delims_close['shp']
elif re.match(" sqlite", featureclass) is not None or re.search("\.db", featureclass) is not None or re.search("\.sqlite", featureclass) is not None:
self.delim_open = delims_open['sqlite']
self.delim_close = delims_close['sqlite']
elif re.match(" in_memory",featureclass) is not None or re.search("in_memory",featureclass) is not None: # dbmses use no delimeters. This is just a guess at how to detect if an fc is in one since I don't have access yet.
self.delim_open = delims_open['in_memory']
self.delim_close = delims_close['in_memory']
elif re.match(" sde",featureclass) is not None: # dbmses use no delimeters. This is just a guess at how to detect if an fc is in one since I don't have access yet.
self.delim_open = ""
self.delim_close = ""
else:
processing_log.warning("No field delimiters for this type of data. We can select features in gdbs, mdbs, shps, in_memory, and possibly sde files (untested)")
return False
return True
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment