## Copyright (C) 2006 Kovid Goyal kovid@kovidgoyal.net ## This program is free software; you can redistribute it and/or modify ## it under the terms of the GNU General Public License as published by ## the Free Software Foundation; either version 2 of the License, or ## (at your option) any later version. ## ## This program is distributed in the hope that it will be useful, ## but WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License along ## with this program; if not, write to the Free Software Foundation, Inc., ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. import os, zipfile from cStringIO import StringIO def extract(filename, dir): """ Extract archive C{filename} into directory C{dir} """ zf = zipfile.ZipFile( filename ) namelist = zf.namelist() dirlist = filter( lambda x: x.endswith( '/' ), namelist ) filelist = filter( lambda x: not x.endswith( '/' ), namelist ) # make base pushd = os.getcwd() if not os.path.isdir( dir ): os.mkdir( dir ) os.chdir( dir ) # create directory structure dirlist.sort() for dirs in dirlist: dirs = dirs.split( '/' ) prefix = '' for dir in dirs: dirname = os.path.join( prefix, dir ) if dir and not os.path.isdir( dirname ): os.mkdir( dirname ) prefix = dirname # extract files for fn in filelist: if os.path.dirname(fn) and not os.path.exists(os.path.dirname(fn)): os.makedirs(os.path.dirname(fn)) out = open( fn, 'wb' ) buffer = StringIO( zf.read( fn )) buflen = 2 ** 20 datum = buffer.read( buflen ) while datum: out.write( datum ) datum = buffer.read( buflen ) out.close() os.chdir( pushd )