home *** CD-ROM | disk | FTP | other *** search
- """ unzip.py
- Version: 1.1
-
- Extract a zipfile to the directory provided
- It first creates the directory structure to house the files
- then it extracts the files to it.
-
- Sample usage:
- command line
- unzip.py -p 10 -z c:\testfile.zip -o c:\testoutput
-
- python class
- import unzip
- un = unzip.unzip()
- un.extract(r'c:\testfile.zip', 'c:\testoutput')
-
-
- By Doug Tolton
- """
-
- import sys
- import zipfile
- import os
- import os.path
- import getopt
-
- class unzip:
- def __init__(self, verbose = False, percent = 10):
- self.verbose = verbose
- self.percent = percent
-
- def extract(self, file, dir):
- if not dir.endswith(':') and not os.path.exists(dir):
- os.mkdir(dir)
-
- zf = zipfile.ZipFile(file)
-
- # create directory structure to house files
- self._createstructure(file, dir)
-
- num_files = len(zf.namelist())
- percent = self.percent
- divisions = 100 / percent
- perc = int(num_files / divisions)
-
- # extract files to directory structure
- for i, name in enumerate(zf.namelist()):
-
- if self.verbose == True:
- print "Extracting %s" % name
- elif perc > 0 and (i % perc) == 0 and i > 0:
- complete = int (i / perc) * percent
- print "%s%% complete" % complete
-
- if not name.endswith('/'):
- outfile = open(os.path.join(dir, name), 'wb')
- outfile.write(zf.read(name))
- outfile.flush()
- outfile.close()
-
- def get_file_list(self, zip_file):
- zf = zipfile.ZipFile(zip_file)
- return zf.namelist()
-
- def extract_file(self, zip_file, file, dest_file, dir):
- if not dir.endswith(':') and not os.path.exists(dir):
- os.mkdir(dir)
-
- zf = zipfile.ZipFile(zip_file)
-
- # extract files to directory structure
- for i, name in enumerate(zf.namelist()):
-
- if not name.endswith('/'):
- if name == file:
- outfile = open(os.path.join(dir, dest_file), 'wb')
- outfile.write(zf.read(name))
- outfile.flush()
- outfile.close()
-
-
- def _createstructure(self, file, dir):
- self._makedirs(self._listdirs(file), dir)
-
-
- def _makedirs(self, directories, basedir):
- """ Create any directories that don't currently exist """
- for dir in directories:
- curdir = os.path.join(basedir, dir)
- if not os.path.exists(curdir):
- os.mkdir(curdir)
-
- def _listdirs(self, file):
- """ Grabs all the directories in the zip structure
- This is necessary to create the structure before trying
- to extract the file to it. """
- zf = zipfile.ZipFile(file)
-
- dirs = []
-
- for name in zf.namelist():
- if name.endswith('/'):
- dirs.append(name)
-
- dirs.sort()
- return dirs
-
- def usage():
- print """usage: unzip.py -z <zipfile> -o <targetdir>
- <zipfile> is the source zipfile to extract
- <targetdir> is the target destination
-
- -z zipfile to extract
- -o target location
- -p sets the percentage notification
- -v sets the extraction to verbose (overrides -p)
-
- long options also work:
- --verbose
- --percent=10
- --zipfile=<zipfile>
- --outdir=<targetdir>"""
-
-
- def main():
- shortargs = 'vhp:z:o:'
- longargs = ['verbose', 'help', 'percent=', 'zipfile=', 'outdir=']
-
- unzipper = unzip()
-
- try:
- opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs)
- except getopt.GetoptError:
- usage()
- sys.exit(2)
-
- zipsource = ""
- zipdest = ""
-
- for o, a in opts:
- if o in ("-v", "--verbose"):
- unzipper.verbose = True
- if o in ("-p", "--percent"):
- if not unzipper.verbose == True:
- unzipper.percent = int(a)
- if o in ("-z", "--zipfile"):
- zipsource = a
- if o in ("-o", "--outdir"):
- zipdest = a
- if o in ("-h", "--help"):
- usage()
- sys.exit()
-
- if zipsource == "" or zipdest == "":
- usage()
- sys.exit()
-
- unzipper.extract(zipsource, zipdest)
-
- if __name__ == '__main__': main()
-