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?
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?
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)
To działa. Stukrotne dzięki. – Tapefreak
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
Co jeśli 'name' jest katalogiem (nie jest to zwykły plik)? Natknąłem się na tę sprawę. – Nawaz
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
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()
To działa również dla mnie. Dzięki. –
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
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()
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()
To nie jest odpowiedź, jeśli używasz Pythona 2.7 zobacz mój komentarz na pytanie – Fabian
można użyć „' '” lewy apostrof lub w jakiś inny sposób wykonywania funkcji systemu i rozpakuj plik – user973254
co chcesz zrobić z backtick? oO – naeg
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