Rozpakowywanie plików w Pythonie

Odpowiedzi:

785
import zipfile
with zipfile.ZipFile(path_to_zip_file, 'r') as zip_ref:
    zip_ref.extractall(directory_to_extract_to)

To już wszystko!

Rahul
źródło
7
co jeśli zawartość archiwum .zip jest taka sama we wszystkich archiwach .zip? jak zmienić nazwę treści przed wypakowaniem? przykład: 1.zip 2.zip .. wszystkie zawierają content.txt: wypakuj wszystko jak 1content.txt 2content.txt?
iratzhash,
8
@iratzhash Zwykle tworzę nowy katalog tymczasowy dla zawartości za pomocą tempfile: docs.python.org/3/library/tempfile.html Rozpakowuję do katalogu tymczasowego i stamtąd przenoszę / organizuję pliki.
Dave Forgac,
8
@ 3kstc Chciałbym from zipfile import ZipFile. Podczas korzystania z niego nie trzeba już używać zipfile.ZipFilei można go używać ZipFile(zip_file_name).
Debugowanie 255
@iratzhash Zdaję sobie sprawę, że skomentowałeś 1,5 roku temu. Ale tak, aby inni wiedzieli, zwykle zawartość pliku zip jest tylko do odczytu. Dobrą odpowiedź jest tutaj przez „Bouke”
Debug255
Niby meta nuta, ale edycja z listopada 2018 r. Czyni tę prawie identyczną z inną odpowiedzią, która już używała menedżera kontekstu (i łączy z tym, co to oznacza).
Engineero
304

Jeśli używasz języka Python 3.2 lub nowszego:

import zipfile
with zipfile.ZipFile("file.zip","r") as zip_ref:
    zip_ref.extractall("targetdir")

Nie musisz używać close ani próbować / catch z tym, ponieważ używa on konstrukcji menedżera kontekstu .

użytkownik1741137
źródło
18
ZipFile działa również jako menedżer kontekstu w wersji 2.7 lub nowszej: docs.python.org/2/library/zipfile.html#zipfile.ZipFile
FelixEnescu
Jak postępować z wyjątkiem docs.python.org/3.6/library/zipfile.html#zipfile.BadZipFile ? Ogólnie, jaka jest najlepsza praktyka, aby używać try / oprócz menedżera kontekstu (z instrukcją)?
SnowOnion
1
zipfile+ pathlib= wygrana. masz coś przeciwko, jeśli nieznacznie zaktualizuję twoją odpowiedź?
Datanovice
38

Użyj tej extractallmetody, jeśli używasz języka Python 2.6+

zip = ZipFile('file.zip')
zip.extractall()
Dan Breen
źródło
Nie musisz określać miejsca docelowego (zip.extractall (miejsce docelowe))?
asonnenschein
3
Nie, jeśli tylko rozpakowujesz katalog do tego samego pliku zip
Dan Gayle,
10
@DanGayle wydaje się, że jest to rozpakowywanie pliku zip do bieżącego katalogu roboczego, NIE lokalizacja pliku zip
Brian Leishman
4
dla mnie ZipFile () nie działał, ale zipfile.ZipFile () działał - po zaimportowaniu pliku zip
Agile Bean
6

Możesz także importować tylko ZipFile:

from zipfile import ZipFile
zf = ZipFile('path_to_file/file.zip', 'r')
zf.extractall('path_to_extract_folder')
zf.close()

Działa w Python 2 i Python 3 .

simhumileco
źródło
1
Dziękujemy za uwagę @MylesHollowed Nie jest to jednak kopia zaakceptowanej odpowiedzi. Zgadzam się, że są do siebie podobni, ale różnią się. Wskazuje na to również twój komentarz, ponieważ zaakceptowany jest zdecydowanie lepszy dla ciebie niż mój. Gdyby to była kopia, byłaby taka sama ... Dla kogoś moja odpowiedź może być cenna, ponieważ być może jest bardziej czytelna i, jak zauważyłeś, importuje mniej kodu ... To z powodu tych różnic zdecydowałem się na odpowiedź dać alternatywę. Czy to nie dlatego możemy podać inne odpowiedzi po zaakceptowaniu jednej? Wszystkiego najlepszego
simhumileco
Co jest nie tak z tą odpowiedzią? Dlaczego ktoś dał jej punkt ujemny? W końcu jest to odpowiedź na pytanie i wyróżnia się prostotą w porównaniu z innymi odpowiedziami, co może być ważne dla niektórych osób, które szukają odpowiedzi. Czyż nie
simhumileco
1
@MylesHollowed import zipfile.ZipFilegeneruje ModuleNotFoundError: No module named 'zipfile.ZipFile'; 'zipfile' is not a packagew 3.6.5. Jestem otwarty na błąd operatora, ale nie wiem, co to jest.
MikeF
6

Spróbuj tego :


import zipfile
def un_zipFiles(path):
    files=os.listdir(path)
    for file in files:
        if file.endswith('.zip'):
            filePath=path+'/'+file
            zip_file = zipfile.ZipFile(filePath)
            for names in zip_file.namelist():
                zip_file.extract(names,path)
            zip_file.close() 

ścieżka: rozpakuj ścieżkę pliku

Gotowe Jin
źródło
3
import os 
zip_file_path = "C:\AA\BB"
file_list = os.listdir(path)
abs_path = []
for a in file_list:
    x = zip_file_path+'\\'+a
    print x
    abs_path.append(x)
for f in abs_path:
    zip=zipfile.ZipFile(f)
    zip.extractall(zip_file_path)

Nie zawiera sprawdzania poprawności pliku, jeśli nie jest skompresowany. Jeśli folder zawiera plik .zip, zakończy się niepowodzeniem.

użytkownik3911901
źródło