¿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)