zipfile pro komprimaci a dekomprimaci souborů ZIP v jazyce Python

Podnikání

Modul zipfile standardní knihovny jazyka Python lze použít ke komprimaci souborů do formátu ZIP a k rozbalování souborů ZIP. Je součástí standardní knihovny, takže není nutná žádná další instalace.

Vysvětlen je následující obsah.

  • Komprimace více souborů do souboru ZIP
  • Přidání nového souboru do existujícího souboru ZIP
  • Komprimace adresáře (složky) do souboru ZIP
  • Komprimované do souboru ZIP s heslem
  • Zkontrolujte obsah souboru ZIP.
  • Rozbalte (rozbalte) celý obsah souboru ZIP.
  • Vyberte obsah souboru ZIP a rozbalte jej.

Komprimace více souborů do souboru ZIP

Vytvořte objekt ZipFile a pomocí metody write() přidejte soubory, které chcete komprimovat.

Chcete-li vytvořit nový soubor ZIP, zadejte cestu k vytvářenému souboru ZIP jako první argument konstruktoru objektu ZipFile a druhý argument takto'w'

Jako třetí argument lze navíc zadat metodu komprese.

  • zipfile.ZIP_STORED:Sloučit více souborů bez komprese (výchozí nastavení)
  • zipfile.ZIP_DEFLATED:Normální komprese ZIP (vyžaduje modul zlib)
  • zipfile.ZIP_BZIP2:Komprese BZIP2 (vyžaduje modul bz2)
  • zipfile.ZIP_LZMA:Komprese LZMA (vyžaduje modul lzma)

BZIP2 a LZMA mají vyšší kompresní poměr (lze je komprimovat na menší velikost), ale doba potřebná ke kompresi je delší.

V metodě write() se soubor s prvním argumentem filename zapíše do souboru ZIP s druhým argumentem arcname. Pokud je vynechán název arcname, použije se název souboru tak, jak je. název arcname může také specifikovat adresářovou strukturu.

Objekt ZipFile je třeba uzavřít metodou close(), ale pokud použijete příkaz with, uzavře se automaticky po ukončení bloku.

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

Zadáním argumentu compress_type metody write() je také možné zvolit metodu komprese pro každý soubor.

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

Přidání nového souboru do existujícího souboru ZIP

Chcete-li přidat nový soubor do existujícího souboru zip, nastavte při vytváření objektu ZipFile první argument konstruktoru na cestu k existujícímu souboru zip. Také druhý argument nastavte následujícím způsobem.'a'

Pak, stejně jako ve výše uvedeném příkladu, stačí přidat soubor pomocí metody write().

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

Komprimace adresáře (složky) do souboru ZIP

Pokud chcete zkomprimovat celý adresář (složku) do jednoho souboru ZIP, můžete použít os.scandir() nebo os.listdir() pro vytvoření seznamu souborů, ale jednodušší je použít make_archive() v modulu shutil.

Viz následující článek.

Komprimované do souboru ZIP s heslem

Modul zipfile neumožňuje vytvářet soubory ZIP chráněné heslem. Pokud chcete soubor zkomprimovat do zaheslovaného souboru ZIP, použijte knihovnu třetí strany pyminizip.

Všimněte si, že dekompresi souborů ZIP chráněných heslem lze provést pomocí modulu zipfile (viz níže).

Zkontrolujte obsah souboru ZIP.

Můžete zkontrolovat obsah existujícího souboru ZIP.

Vytvoření objektu ZipFile nastavením prvního argumentu file v konstruktoru na cestu k existujícímu souboru zip a druhého argumentu mode na 'r'. Argument mode lze vynechat, protože výchozí hodnota je 'r'.

K získání seznamu archivovaných souborů můžete použít metodu namelist() objektu ZipFile.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

Rozbalte (rozbalte) celý obsah souboru ZIP.

Chcete-li rozbalit obsah souboru ZIP, vytvořte objekt ZipFile s prvním argumentem file v konstruktoru jako cestou k existujícímu souboru ZIP a druhým argumentem mode jako 'r', jako ve výše uvedeném příkladu. Argument mode lze vynechat, protože je výchozí hodnotou 'r'.

Metoda extractall() objektu ZipFile extrahuje (rozbalí) celý obsah souboru ZIP. První argument, cesta, určuje cestu k adresáři, do kterého se má soubor rozbalit. Pokud je vynechán, budou soubory rozbaleny do aktuálního adresáře.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

Soubor ZIP s heslem lze extrahovat zadáním hesla jako argumentu pwd metody extractall().

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

Vyberte obsah souboru ZIP a rozbalte jej.

Pokud chcete rozbalit a rozbalit pouze určité soubory, použijte metodu extract().

Prvním argumentem metody extract() je název souboru, který se má extrahovat, a druhým argumentem je cesta k adresáři, do kterého se má extrahovat. Pokud je argument cesta vynechán, bude soubor extrahován do aktuálního adresáře. Název extrahovaného souboru by měl obsahovat cestu k adresáři v souboru ZIP, pokud je v něm uložen.

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

Stejně jako metoda extractall() umožňuje metoda extract() zadat jako argument pwd heslo.

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')