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?

Était-ce utile?

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top