2012-02-24 30 views
47

To jest kod, którego używam obecnie do wypakowania pliku zip, który znajduje się w tym samym bieżącym katalogu roboczym co skrypt. Jak określić inny katalog do wyodrębnienia?Wyodrębnianie zawartości pliku ZIP do określonego katalogu w Pythonie 2.7

Kod, który próbowałem, nie wyodrębnia go tam, gdzie chcę.

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

Czy należy przenieść "C: \\" + do otwartego połączenia zamiast wywołania zapisu? –

Odpowiedz

96

myślę, że właśnie dostał mixup tutaj. Powinny prawdopodobnie być coś jak następuje:

import zipfile 

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

i jeśli po prostu chcesz, aby wyodrębnić wszystkie pliki:

import zipfile 

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

Plik ZipFile nie ma atrybutu '__exit__', więc nie wiem, w jaki sposób twoje oświadczenie zadziała tak jak jest. – adam

+0

Jeśli tworzysz instancję 'ZipFile', to ma ona metodę' __exit__'. Właśnie podałem przykład innej próby (python 2.7) i działa jak napisano. – secretmike

+0

Python 2.6 ma inną implementację ZipFile z jakiegoś powodu. – adam

2

Peter de Rivaz ma punkt w powyższym komentarzu. Będziesz chciał mieć katalog w wywołaniu, aby otworzyć(). Będziesz chciał zrobić coś takiego:

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

Próbowałem innych odpowiedzi w tym wątku, ale ostateczne rozwiązanie dla mnie było po prostu :

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

Spójrz na extractall, ale używać go tylko z zaufanych plików zip.

+2

Sugeruję wywołanie 'zfile.close()', jak to mówi w [ZipFile.close] (https://docs.python.org/2/library/zipfile.html#zipfile .ZipFile.close), że ** Musisz wywołać metodę close() przed zakończeniem programu lub istotne zapisy nie zostaną zapisane. **. – erwaman

0

Mam zmodyfikowany kod, aby zapytać użytkownika wejście nazwą plik i jego ścieżkę, gdzie muszą być wyodrębnione i tak użytkownik will've więcej kontroli nad gdzie umieścić rozpakowany folder i jaka nazwa należy przypisać do wyodrębnionego folderu.

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

Dodanie do powyższej odpowiedzi secretmike ze wsparciem dla Pythona 2.6 do wyodrębniania wszystkich plików.

import zipfile 
import contextlib 


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

Jeśli tylko chcesz, aby wyodrębnić plik zip z wiersza poleceń przy użyciu Python (słownie bo nie masz polecenia rozpakowywania jest dostępny), a następnie można wywołać zipfile moduł bezpośrednio

python -m zipfile -e monty.zip target-dir/ 

Spójrz na docs. Obsługuje również kompresję i wyświetla zawartość.

Powiązane problemy