python zip zipfile python-2.4

¿Cómo descomprimir un archivo con Python 2.4?



zip zipfile (5)

Estoy probando en Python 2.7.3rc2 y el 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 el subdirectorio, como se muestra a continuación:

[''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 el dirName existe 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()

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?


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

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

He aquí 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


Tienes que usar namelist() y extract() . Ejemplo de considerar directorios

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)