Ho difficoltà a capire come decomprimere un file zip con 2.4. extract()
non è incluso in 2.4. Sono limitato a utilizzare 2.4.4 sul mio server.Come decomprimere un file con Python 2.4?
Qualcuno può fornire un esempio di codice semplice?
Ho difficoltà a capire come decomprimere un file zip con 2.4. extract()
non è incluso in 2.4. Sono limitato a utilizzare 2.4.4 sul mio server.Come decomprimere un file con Python 2.4?
Qualcuno può fornire un esempio di codice semplice?
È necessario utilizzare namelist()
e extract()
. Esempi considerando directory
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)
Questo funziona. Grazie mille. – Tapefreak
Finito di copiare questo e notato una piccola cosa. Almeno se si comprime il file con Win7 "sendTo file zip" e il file zip contiene cartelle nidificate, è necessario modificare os.mkdir (dirname) -> os.makedirs (dirname).Altrimenti potresti ottenere delle eccezioni (Nessun file o directory), dato che il file zip contiene solo le cartelle foglia – fastfox
Cosa succede se 'name' è una directory (non un file normale)? Mi sono imbattuto in questo caso. – Nawaz
Non completamente testato, ma dovrebbe essere a posto:
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
C'è qualche problema con la risposta di Vinko (almeno quando l'eseguo). Ho ottenuto:
IOError: [Errno 13] Permission denied: '01org-webapps-countingbeads-422c4e1/'
Ecco come risolverlo:
# 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()
Funziona anche per me. Grazie. –
Non dovrebbe essere 'fd = open (name, 'wb')' nel caso in cui alcuni dei file compressi siano immagini o comunque file binari? – ArtB
Modifica Ovilia's answer in modo che è possibile specificare la directory di destinazione così:
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()
sto testando in Python 2.7. 3rc2 e il ZipFile.namelist()
non restituiscono una voce con solo il nome della sottodirectory per creare una sottodirectory, ma solo un elenco di nomi di file con sottodirectory, come segue:
['20130923104558/control.json', '20130923104558/test.csv']
quindi il controllo
if fileName == '':
non restituisce True
affatto.
Quindi ho modificato il codice per verificare se lo dirName
esiste all'interno di destDir
e per creare dirName
se non esiste. Il file viene estratto solo se la parte fileName
non è vuota. Quindi questo dovrebbe prendersi cura della condizione in cui un nome di directory può apparire in 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()
Questa non è la risposta se stai usando python 2.7 vedi il mio commento sulla domanda – Fabian
è possibile utilizzare "' '" operatore backtick o qualche altro modo di eseguire la funzione del sistema e decomprimere il file – user973254
che cosa si vuole fare con un apice? oO – naeg
Se hai trovato questa domanda, ma utilizza una versione più recente di python fare questo: zfile = zipfile.ZipFile (file_to_extract) zfile.extractall (target_dir) – Fabian