Comment décompresser un fichier avec Python 2.4?
-
25-10-2019 - |
Question
Je vais avoir du mal à comprendre comment décompressez un fichier zip avec 2.4. extract()
ne figure pas dans 2.4. Je suis limité à l'utilisation 2.4.4 sur mon serveur.
Quelqu'un peut-il s'il vous plaît fournir un exemple simple de code?
La solution
Vous devez utiliser namelist()
et extract()
. répertoires exemples considérant
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)
Autres conseils
Il y a un problème avec la réponse de Vinko (au moins quand je le lance). Je suis arrivé:
IOError: [Errno 13] Permission denied: '01org-webapps-countingbeads-422c4e1/'
Voici comment le résoudre:
# 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()
La réponse de modification Ovilia afin que vous pouvez spécifier le répertoire de destination ainsi:
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()
Pas entièrement testé, mais il devrait être correct:
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
Je teste en Python 2.7.3rc2 et l'ZipFile.namelist()
ne retourne pas une entrée avec juste sous le nom de répertoire pour créer un sous-répertoire, mais seulement une liste de noms de fichiers avec sous-répertoire, comme suit:
['20130923104558/control.json', '20130923104558/test.csv']
Ainsi, le contrôle
if fileName == '':
n'évalue pas True
du tout.
Je modifié le code pour vérifier si le dirName
existe à l'intérieur destDir
et de créer dirName
si elle n'existe pas. Le fichier est extrait uniquement si une partie de fileName
n'est pas vide. Donc, cela devrait prendre soin de l'état où un nom de répertoire peut apparaître dans 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()