home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 May / maximum-cd-2010-05.iso / DiscContents / boxee-0.9.20.10711.exe / scripts / OpenSubtitles / resources / lib / unzip.py < prev    next >
Encoding:
Python Source  |  2009-07-20  |  4.3 KB  |  161 lines

  1. """ unzip.py
  2.     Version: 1.1
  3.  
  4.     Extract a zipfile to the directory provided
  5.     It first creates the directory structure to house the files
  6.     then it extracts the files to it.
  7.  
  8.     Sample usage:
  9.     command line
  10.     unzip.py -p 10 -z c:\testfile.zip -o c:\testoutput
  11.  
  12.     python class
  13.     import unzip
  14.     un = unzip.unzip()
  15.     un.extract(r'c:\testfile.zip', 'c:\testoutput')
  16.     
  17.  
  18.     By Doug Tolton
  19. """
  20.  
  21. import sys
  22. import zipfile
  23. import os
  24. import os.path
  25. import getopt
  26.  
  27. class unzip:
  28.     def __init__(self, verbose = False, percent = 10):
  29.         self.verbose = verbose
  30.         self.percent = percent
  31.         
  32.     def extract(self, file, dir):
  33.         if not dir.endswith(':') and not os.path.exists(dir):
  34.             os.mkdir(dir)
  35.  
  36.         zf = zipfile.ZipFile(file)
  37.  
  38.         # create directory structure to house files
  39.         self._createstructure(file, dir)
  40.  
  41.         num_files = len(zf.namelist())
  42.         percent = self.percent
  43.         divisions = 100 / percent
  44.         perc = int(num_files / divisions)
  45.  
  46.         # extract files to directory structure
  47.         for i, name in enumerate(zf.namelist()):
  48.  
  49.             if self.verbose == True:
  50.                 print "Extracting %s" % name
  51.             elif perc > 0 and (i % perc) == 0 and i > 0:
  52.                 complete = int (i / perc) * percent
  53.                 print "%s%% complete" % complete
  54.  
  55.             if not name.endswith('/'):
  56.                 outfile = open(os.path.join(dir, name), 'wb')
  57.                 outfile.write(zf.read(name))
  58.                 outfile.flush()
  59.                 outfile.close()
  60.  
  61.     def get_file_list(self, zip_file):
  62.         zf = zipfile.ZipFile(zip_file)
  63.     return zf.namelist()
  64.         
  65.     def extract_file(self, zip_file, file, dest_file, dir):
  66.         if not dir.endswith(':') and not os.path.exists(dir):
  67.             os.mkdir(dir)
  68.  
  69.         zf = zipfile.ZipFile(zip_file)
  70.  
  71.         # extract files to directory structure
  72.         for i, name in enumerate(zf.namelist()):
  73.  
  74.             if not name.endswith('/'):
  75.         if name == file:
  76.             outfile = open(os.path.join(dir, dest_file), 'wb')
  77.                 outfile.write(zf.read(name))
  78.                 outfile.flush()
  79.                 outfile.close()
  80.  
  81.  
  82.     def _createstructure(self, file, dir):
  83.         self._makedirs(self._listdirs(file), dir)
  84.  
  85.  
  86.     def _makedirs(self, directories, basedir):
  87.         """ Create any directories that don't currently exist """
  88.         for dir in directories:
  89.             curdir = os.path.join(basedir, dir)
  90.             if not os.path.exists(curdir):
  91.                 os.mkdir(curdir)
  92.  
  93.     def _listdirs(self, file):
  94.         """ Grabs all the directories in the zip structure
  95.         This is necessary to create the structure before trying
  96.         to extract the file to it. """
  97.         zf = zipfile.ZipFile(file)
  98.  
  99.         dirs = []
  100.  
  101.         for name in zf.namelist():
  102.             if name.endswith('/'):
  103.                 dirs.append(name)
  104.  
  105.         dirs.sort()
  106.         return dirs
  107.  
  108. def usage():
  109.     print """usage: unzip.py -z <zipfile> -o <targetdir>
  110.     <zipfile> is the source zipfile to extract
  111.     <targetdir> is the target destination
  112.  
  113.     -z zipfile to extract
  114.     -o target location
  115.     -p sets the percentage notification
  116.     -v sets the extraction to verbose (overrides -p)
  117.  
  118.     long options also work:
  119.     --verbose
  120.     --percent=10
  121.     --zipfile=<zipfile>
  122.     --outdir=<targetdir>"""
  123.     
  124.  
  125. def main():
  126.     shortargs = 'vhp:z:o:'
  127.     longargs = ['verbose', 'help', 'percent=', 'zipfile=', 'outdir=']
  128.  
  129.     unzipper = unzip()
  130.  
  131.     try:
  132.         opts, args = getopt.getopt(sys.argv[1:], shortargs, longargs)
  133.     except getopt.GetoptError:
  134.         usage()
  135.         sys.exit(2)
  136.  
  137.     zipsource = ""
  138.     zipdest = ""
  139.  
  140.     for o, a in opts:
  141.         if o in ("-v", "--verbose"):
  142.             unzipper.verbose = True
  143.         if o in ("-p", "--percent"):
  144.             if not unzipper.verbose == True:
  145.                 unzipper.percent = int(a)
  146.         if o in ("-z", "--zipfile"):
  147.             zipsource = a
  148.         if o in ("-o", "--outdir"):
  149.             zipdest = a
  150.         if o in ("-h", "--help"):
  151.             usage()
  152.             sys.exit()
  153.  
  154.     if zipsource == "" or zipdest == "":
  155.         usage()
  156.         sys.exit()
  157.             
  158.     unzipper.extract(zipsource, zipdest)
  159.  
  160. if __name__ == '__main__': main()
  161.