¿Cómo descomprimir un archivo con Python 2.4?

Me resulta difícil descubrir cómo descomprimir un archivo zip con 2.4. extract() no está incluido en 2.4. Estoy restringido a usar 2.4.4 en mi servidor.

¿Puede alguien proporcionar un ejemplo de código simple?

Tienes que usar namelist() y extract() . Ejemplos de directorios de muestra

 import zipfile import os.path import os zfile = zipfile.ZipFile("test.zip") for name in zfile.namelist(): (dirname, filename) = os.path.split(name) print "Decompressing " + filename + " on " + dirname if not os.path.exists(dirname): os.makedirs(dirname) zfile.extract(name, dirname) 

Hay un problema con la respuesta de Vinko (al menos cuando la ejecuto). Tengo:

 IOError: [Errno 13] Permission denied: '01org-webapps-countingbeads-422c4e1/' 

Aquí está cómo resolverlo:

 # unzip a file def unzip(path): zfile = zipfile.ZipFile(path) for name in zfile.namelist(): (dirname, filename) = os.path.split(name) if filename == '': # directory if not os.path.exists(dirname): os.mkdir(dirname) else: # file fd = open(name, 'w') fd.write(zfile.read(name)) fd.close() zfile.close() 

Modificando la respuesta de Ovilia para que también pueda especificar el directorio de destino:

 def unzip(zipFilePath, destDir): zfile = zipfile.ZipFile(zipFilePath) for name in zfile.namelist(): (dirName, fileName) = os.path.split(name) if fileName == '': # directory newDir = destDir + '/' + dirName if not os.path.exists(newDir): os.mkdir(newDir) else: # file fd = open(destDir + '/' + name, 'wb') fd.write(zfile.read(name)) fd.close() zfile.close() 

No está completamente probado, pero debería estar bien:

 import os from zipfile import ZipFile, ZipInfo class ZipCompat(ZipFile): def __init__(self, *args, **kwargs): ZipFile.__init__(self, *args, **kwargs) def extract(self, member, path=None, pwd=None): if not isinstance(member, ZipInfo): member = self.getinfo(member) if path is None: path = os.getcwd() return self._extract_member(member, path) def extractall(self, path=None, members=None, pwd=None): if members is None: members = self.namelist() for zipinfo in members: self.extract(zipinfo, path) def _extract_member(self, member, targetpath): if (targetpath[-1:] in (os.path.sep, os.path.altsep) and len(os.path.splitdrive(targetpath)[1]) > 1): targetpath = targetpath[:-1] if member.filename[0] == '/': targetpath = os.path.join(targetpath, member.filename[1:]) else: targetpath = os.path.join(targetpath, member.filename) targetpath = os.path.normpath(targetpath) upperdirs = os.path.dirname(targetpath) if upperdirs and not os.path.exists(upperdirs): os.makedirs(upperdirs) if member.filename[-1] == '/': if not os.path.isdir(targetpath): os.mkdir(targetpath) return targetpath target = file(targetpath, "wb") try: target.write(self.read(member.filename)) finally: target.close() return targetpath 

Estoy probando en Python 2.7.3rc2 y ZipFile.namelist() no está devolviendo una entrada con solo el nombre del subdirectorio para crear un subdirectorio, sino solo una lista de nombres de archivos con subdirectorio, de la siguiente manera:

['20130923104558/control.json', '20130923104558/test.csv']

Asi el cheque

if fileName == '':

No evalúa a True en absoluto.

Así que modifiqué el código para verificar si existe destDir dentro de destDir y para crear dirName si no existe. El archivo se extrae solo si la parte fileName no está vacía. Así que esto debería hacerse cargo de la condición en la que puede aparecer un nombre de directorio en ZipFile.namelist()

 def unzip(zipFilePath, destDir): zfile = zipfile.ZipFile(zipFilePath) for name in zfile.namelist(): (dirName, fileName) = os.path.split(name) # Check if the directory exisits newDir = destDir + '/' + dirName if not os.path.exists(newDir): os.mkdir(newDir) if not fileName == '': # file fd = open(destDir + '/' + name, 'wb') fd.write(zfile.read(name)) fd.close() zfile.close()