Как распаковать файл с Python 2.4? - PullRequest
30 голосов
/ 18 октября 2011

Мне трудно понять, как разархивировать zip-файл с 2.4.extract() не входит в 2.4.Я ограничен использованием 2.4.4 на моем сервере.

Может кто-нибудь привести пример простого кода?

Ответы [ 5 ]

51 голосов
/ 18 октября 2011

Вы должны использовать namelist() и extract(). Образец с учетом каталогов

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)
12 голосов
/ 30 января 2013

Есть некоторая проблема с ответом Винко (по крайней мере, когда я его запускаю). Я получил:

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

Вот как это решить:

# 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()
3 голосов
/ 23 апреля 2013

Изменение Ответ Овилии , чтобы вы также могли указать каталог назначения:

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()
1 голос
/ 18 октября 2011

Не полностью протестировано, но должно быть в порядке:

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
0 голосов
/ 23 сентября 2013

Я тестирую в Python 2.7.3rc2, и ZipFile.namelist() не возвращает запись только с именем подкаталога для создания подкаталога, а только список имен файлов с подкаталогом, как показано ниже:

['20130923104558/control.json', '20130923104558/test.csv']

При этом чек

if fileName == '':

вообще не оценивается в True.

Поэтому я изменил код, чтобы проверить, существует ли dirName внутри destDir, и создать dirName, если он не существует. Файл извлекается, только если fileName часть не пуста. Так что это должно позаботиться о состоянии, когда имя каталога может появиться в 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()
...