My previous employer liked using
GIS Pro to collect GIS field data on iPads. My employer wanted to equip surveyors with a variety of GIS information to be used in the field - parcels, political boundaries, company assets, and others. To do so, we first had to create shapefiles and add them to zip files for our data to be compatible with GIS Pro. All this information required geoprocessing to make sure the right data was added to each surveyor's iPad without bogging down GIS Pro's software with a crippling overabundance of data. Once that processing was complete I needed to create a function that would get my shapefiles zipped up nicely and ready for upload. To start, I hunted down all the possible
shapefile file extensions. With use of Python's
zipfile module I developed my function to add all shapefile files to a new zipfile that inherits its file name from the shapefile. I also added the option to keep or delete the shapefile from its directory after zipping by setting the Boolean Delete variable to either True or False.
The code:
import os
import zipfile
import arcpy
def ZipShp (inShp, Delete = True):
"""
Creates a zip file containing the input shapefile
inputs -
inShp: Full path to shapefile to be zipped
Delete: Set to True to delete shapefile files after zip
"""
#List of shapefile file extensions
extensions = [".shp",
".shx",
".dbf",
".sbn",
".sbx",
".fbn",
".fbx",
".ain",
".aih",
".atx",
".ixs",
".mxs",
".prj",
".xml",
".cpg"]
#Directory of shapefile
inLocation = arcpy.Describe (inShp).path
#Base name of shapefile
inName = arcpy.Describe (inShp).baseName
#Create zipfile name
zipfl = os.path.join (inLocation, inName + ".zip")
#Create zipfile object
ZIP = zipfile.ZipFile (zipfl, "w")
#Iterate files in shapefile directory
for fl in os.listdir (inLocation):
#Iterate extensions
for extension in extensions:
#Check if file is shapefile file
if fl == inName + extension:
#Get full path of file
inFile = os.path.join (inLocation, fl)
#Add file to zipfile
ZIP.write (inFile, fl)
break
#Delete shapefile if indicated
if Delete == True:
arcpy.Delete_management (inShp)
#Close zipfile object
ZIP.close()
#Return zipfile full path
return zipfl
And for those of you without the ArcPy module:
import os
import zipfile
def ZipShp (inShp, Delete = True):
"""
Creates a zip file containing the input shapefile
inputs -
inShp: Full path to shapefile to be zipped
Delete: Set to True to delete shapefile files after zip
"""
#List of shapefile file extensions
extensions = [".shp",
".shx",
".dbf",
".sbn",
".sbx",
".fbn",
".fbx",
".ain",
".aih",
".atx",
".ixs",
".mxs",
".prj",
".xml",
".cpg",
".shp.xml"]
#Directory of shapefile
inLocation = os.path.dirname (inShp)
#Base name of shapefile
inName = os.path.basename (os.path.splitext (inShp)[0])
#Create zipfile name
zipfl = os.path.join (inLocation, inName + ".zip")
#Create zipfile object
ZIP = zipfile.ZipFile (zipfl, "w")
#Empty list to store files to delete
delFiles = []
#Iterate files in shapefile directory
for fl in os.listdir (inLocation):
#Iterate extensions
for extension in extensions:
#Check if file is shapefile file
if fl == inName + extension:
#Get full path of file
inFile = os.path.join (inLocation, fl)
#Add file to delete files list
delFiles += [inFile]
#Add file to zipfile
ZIP.write (inFile, fl)
break
#Delete shapefile if indicated
if Delete == True:
for fl in delFiles:
os.remove (fl)
#Close zipfile object
ZIP.close()
#Return zipfile full path
return zipfl