2011-10-18 15 views
30

Ciężko mi się zastanawiać, jak rozpakować plik zip w wersji 2.4. extract() nie jest zawarte w 2.4. Jestem ograniczony do używania 2.4.4 na moim serwerze.Jak rozpakować plik za pomocą Pythona w wersji 2.4?

Czy ktoś może podać prosty przykład kodu?

+0

można użyć „' '” lewy apostrof lub w jakiś inny sposób wykonywania funkcji systemu i rozpakuj plik – user973254

+1

co chcesz zrobić z backtick? oO – naeg

+3

Jeśli znalazłeś na to pytanie, ale są przy użyciu nowszej wersji Pythona to zrobić: zfile = zipfile.ZipFile (file_to_extract) zfile.extractall (target_dir) – Fabian

Odpowiedz

51

Należy użyć namelist() i extract(). Przykładowe rozważa katalogi

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) 
+0

To działa. Stukrotne dzięki. – Tapefreak

+2

Skończyłem kopiowanie tego i zauważyłem jedną małą rzecz. Przynajmniej jeśli spakujesz plik za pomocą opcji win7 "sendto zip file", a twój plik zip zawiera zagnieżdżone foldery, musisz zmienić os.mkdir (dirname) -> os.makedirs (dirname).W przeciwnym razie możesz uzyskać wyjątki (brak takiego pliku lub katalogu), ponieważ plik zip zawiera tylko foldery z liśćmi. – fastfox

+1

Co jeśli 'name' jest katalogiem (nie jest to zwykły plik)? Natknąłem się na tę sprawę. – Nawaz

1

Nie w pełni przetestowany, ale powinno być w porządku:

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 
12

Jest jakiś problem z odpowiedzią VINKO jest (przynajmniej kiedy go uruchomić). Mam:

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

Oto jak go rozwiązać:

# 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() 
+2

To działa również dla mnie. Dzięki. –

+1

Czy nie powinno to być 'fd = open (name, 'wb')' w przypadku niektórych spakowanych plików są obrazy lub w inny sposób pliki binarne? – ArtB

3

Modyfikowanie Ovilia's answer, dzięki czemu można określić katalog docelowy, a także:

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

jestem testowania w Pythonie 2.7. 3rc2 i ZipFile.namelist() nie zwraca pozycji z samą podkatalogową nazwą dla utworzenia podkatalogu, ale tylko listę nazw plików z podkatalogiem w następujący sposób:

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

Zatem kontrola

if fileName == '':

nie ocenia się True w ogóle.

Więc zmodyfikowałem kod, aby sprawdzić, czy dirName istnieje wewnątrz destDir i utworzyć dirName, jeśli nie istnieje. Plik jest wyodrębniany tylko wtedy, gdy część nie jest pusta. Tak to powinno dbać o stan, w którym może pojawić się nazwa katalogu w 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() 
+0

To nie jest odpowiedź, jeśli używasz Pythona 2.7 zobacz mój komentarz na pytanie – Fabian

Powiązane problemy