2012-02-24 14 views
47

Bu, şu anda geçerli geçerli çalışma dizininde bulunan bir zip dosyasını ayıklamak için kullandığım kod. Ayıklanacak farklı bir dizini nasıl belirleyebilirim?Zip dosyası içeriğini Python 2.7'deki belirli bir dizine ayıklama

Denediğim kod, istediğim yerde ayıklamıyor.

import zipfile 

fh = open('test.zip', 'rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outfile = open(name, 'wb') 
    outfile.write('C:\\'+z.read(name)) 
    outfile.close() 
fh.close() 
+1

'C: \\' + 'yı yazma çağrısı yerine açık aramaya taşıyacak mısınız? –

cevap

96

Ben sadece burada bir mixup buldum. Muhtemelen aşağıdaki gibi bir şey olmalı:

import zipfile 

fh = open('test.zip', 'rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outpath = "C:\\" 
    z.extract(name, outpath) 
fh.close() 

ve sadece tüm dosyaları ayıklamak istiyorsanız:

import zipfile 

with zipfile.ZipFile('test.zip', "r") as z: 
    z.extractall("C:\\") 
+0

ZipFile '__exit__' özniteliğine sahip değil, dolayısıyla ifadenizin nasıl çalışacağını bilmiyorum. – adam

+0

Bir "ZipFile" örneği oluşturursanız, bir '__exit__' yöntemine sahiptir. Ben sadece başka bir deneme (python 2.7) verdim ve yazılı olarak çalışır. – secretmike

+0

Python 2.6, bazı sebeplerden dolayı ZipFile uygulamasının farklı bir uygulamasına sahiptir. – adam

2

Peter de Rivaz'ın yukarıdaki yorumda bir anlamı vardır. Açmak için çağrıda dizinin olmasını isteyeceksiniz(). Böyle bir şey yapmak istiyorum yapacaksın:

import zipfile 
import os 

os.mkdir('outdir') 
fh = open('test.zip','rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    outfile = open('outdir'+'/'+name, 'wb') 
    outfile.write() 
    outfile.close() 
fh.close() 
10

Bu thread diğer cevaplar çalıştı, ama benim için nihai çözüm basitçe :

zfile = zipfile.ZipFile('filename.zip') 
zfile.extractall(optional_target_folder) 

extractall bak, ama sadece güvenilir zip dosyaları ile kullanmak.

+2

belirtilen soruyu, [ZipFile.close] (https://docs.python.org/2/library/zipfile.html#zipfile) 'de de belirtildiği gibi, zfile.close() 'yi çağırmanızı öneririm .ZipFile.close) bu ** Programınızdan çıkmadan önce close() 'i çağırmalısınız veya gerekli kayıtlar yazılmayacaktır. **. – erwaman

0

Ben çıkarılacak gereken yere kullanıcıya girişidosya adı ve yolunu sormaya kodunu değiştirmiş ve ettik böylece will've kullanıcı hangi isimle çıkarılan klasör ve koyun nerede daha fazla kontrol ayıklanan klasöre atanmalıdır. en tüm dosyaları ayıklanması için python 2.6 desteği ile yukarıda cevap secretmike ekleme

import zipfile 

#picking zip file from the directory 
ZipFileName = raw_input("Enter full path to zip file:") 
fh = open(ZipFileName , 'rb') 
z = zipfile.ZipFile(fh) 

#assigning a name to the extracted zip folder 
DestZipFolderName = raw_input("Assign destination folder a name: ") 
DestPathName = raw_input("Enter destination directory: ") 
DestPath = DestPathName + "\\" + DestZipFolderName 

for name in z.namelist(): 
    outpath = DestPath 
    z.extract(name, outpath) 
fh.close() 
4

. Sadece Python kullanarak komut satırından bir zip dosyası ayıklamak istiyorsanız

import zipfile 
import contextlib 


with contextlib.closing(zipfile.ZipFile('test.zip', "r")) as z: 
    z.extractall("C:\\") 
3

o zaman zipfile modülü doğrudan

python -m zipfile -e monty.zip target-dir/ 
arayabilir, (diyelim mevcut unzip komutu yok çünkü)

docs'a bir göz atın. Ayrıca sıkıştırmayı ve içeriğini listelemeyi de destekler.

İlgili konular