Converting ZIP archives to TAR archives
March 2005 | Fredrik Lundh
Here’s a small snippet that converts a ZIP archive to a matching TAR.GZ archive. I use a variation of this script to create TAR.GZ source archives on Windows (asking distutils to create a TAR archive doesn’t really work on Windows, at least not in 2.4).
Convert ZIP archive to TAR archive on the fly
# File: zip2tar.py # # Convert ZIP archive to TAR.GZ archive. # # Written by Fredrik Lundh, March 2005. # helpers (tweak as necessary) def getuser(): # return user name and user id return "anonymous", 1000 def getmode(name, data): # return mode ("b" or "t") for the given file. # you can do this either by inspecting the name, or # the actual data (e.g. by looking for non-ascii, non- # line-feed data). return "t" # assume everything's text, for now # # main import tarfile import zipfile import glob, os, StringIO, sys, time now = time.time() user = getuser() def fixup(infile): file, ext = os.path.splitext(infile) outfile = file + ".tar.gz" dirname = os.path.basename(file) print outfile zip = zipfile.ZipFile(infile, "r") tar = tarfile.open(outfile, "w:gz") tar.posix = 1 for name in zip.namelist(): if name.endswith("/"): continue data = zip.read(name) if getmode(name, data) == "t": data = data.replace("\r\n", "\n") tarinfo = tarfile.TarInfo() tarinfo.name = name tarinfo.size = len(data) tarinfo.mtime = now tarinfo.uname = tarinfo.gname = user[0] tarinfo.uid = tarinfo.gid = user[1] tar.addfile(tarinfo, StringIO.StringIO(data)) tar.close() zip.close() # convert all ZIP files in the current directory for file in glob.glob("*.zip"): fixup(file)