zipfile om ZIP-bestanden in Python te comprimeren en te uncomprimeren

Bedrijf

De zipfile-module van de Python-standaardbibliotheek kan worden gebruikt om bestanden in ZIP's te comprimeren en ZIP-bestanden uit te pakken. De module is opgenomen in de standaardbibliotheek, zodat geen extra installatie nodig is.

De volgende inhoud wordt toegelicht.

  • Meerdere bestanden comprimeren in een ZIP-bestand
  • Een nieuw bestand toevoegen aan een bestaand ZIP-bestand
  • Een directory (map) comprimeren in een ZIP-bestand
  • Gecomprimeerd in een ZIP-bestand met een wachtwoord
  • Controleer de inhoud van het ZIP-bestand.
  • Pak de volledige inhoud van het ZIP-bestand uit (unpack).
  • Selecteer de inhoud van het ZIP-bestand en pak het uit.

Meerdere bestanden comprimeren in een ZIP-bestand

Maak een ZipFile object en gebruik de write() methode om de bestanden die je wilt comprimeren toe te voegen.

Om een nieuw ZIP-bestand te maken, specificeert u het pad van het te maken ZIP-bestand als eerste argument van de constructor van het ZipFile-object, en het tweede argument als volgt'w'

Bovendien kan de compressiemethode als derde argument worden opgegeven.

  • zipfile.ZIP_STORED:Gewoon meerdere bestanden combineren zonder compressie (standaard)
  • zipfile.ZIP_DEFLATED:Normale ZIP compressie (zlib module vereist)
  • zipfile.ZIP_BZIP2:BZIP2 compressie (bz2 module vereist)
  • zipfile.ZIP_LZMA:LZMA compressie (lzma module vereist)

BZIP2 en LZMA hebben een hogere compressieverhouding (kunnen worden gecomprimeerd tot een kleinere omvang), maar de tijd die nodig is voor de compressie is langer.

In de write() methode wordt het bestand met het eerste argument filename geschreven naar een ZIP bestand met het tweede argument arcname. Als arcname wordt weggelaten, wordt bestandsnaam gebruikt zoals hij is. arcname kan ook een directory structuur specificeren.

Het ZipFile object moet gesloten worden met de close() methode, maar als je het with statement gebruikt, zal het automatisch gesloten worden als het blok afgelopen is.

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')

Door het compress_type argument van de write() methode te specificeren, is het ook mogelijk om de compressiemethode voor elk bestand te selecteren.

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')

Een nieuw bestand toevoegen aan een bestaand ZIP-bestand

Om een nieuw bestand toe te voegen aan een bestaand zip-bestand, stel het eerste argument van de constructor in op het pad van het bestaande zip-bestand bij het aanmaken van het ZipFile object. Stel ook het tweede argument mode als volgt in.'a'

Voeg dan, zoals in het voorbeeld hierboven, het bestand toe met de methode write().

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

Een directory (map) comprimeren in een ZIP-bestand

Als je een hele directory (map) wil comprimeren in een enkel ZIP-bestand, kan je os.scandir() of os.listdir() gebruiken om een lijst van bestanden te maken, maar het is gemakkelijker om make_archive() te gebruiken in de shutil module.

Zie het volgende artikel.

Gecomprimeerd in een ZIP-bestand met een wachtwoord

De zipfile module laat niet toe om wachtwoord-beveiligde ZIPs te maken. Als u een bestand wilt comprimeren in een wachtwoord-beveiligd zip-bestand, gebruik dan de derde partij bibliotheek pyminizip.

Merk op dat de decompressie van wachtwoord-beveiligde ZIP's kan worden gedaan met de zipfile module (zie hieronder).

Controleer de inhoud van het ZIP-bestand.

U kunt de inhoud van een bestaand ZIP-bestand controleren.

Maak een ZipFile object door het eerste argument file in de constructor op het pad van het bestaande zip-bestand te zetten en het tweede argument mode op 'r'. Het argument mode kan weggelaten worden aangezien de standaard 'r' is.

U kunt de namelist() methode van het ZipFile object gebruiken om een lijst van gearchiveerde bestanden te krijgen.

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']

Pak de volledige inhoud van het ZIP-bestand uit (unpack).

Om de inhoud van een ZIP-bestand uit te pakken, maakt u een ZipFile-object aan met het eerste argument file in de constructor als het pad naar het bestaande ZIP-bestand en het tweede argument mode als 'r', zoals in het voorbeeld hierboven. Het argument mode kan worden weggelaten omdat het standaard op 'r' staat.

De methode extractall() van het ZipFile-object pakt de volledige inhoud van het ZIP-bestand uit (uncompresses). Het eerste argument, path, specificeert het pad van de directory waarnaar wordt uitgepakt. Als het wordt weggelaten, worden de bestanden uitgepakt in de huidige directory.

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

Een ZIP-bestand met een wachtwoord kan worden uitgepakt door het wachtwoord op te geven als het argument pwd van de methode extractall().

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

Selecteer de inhoud van het ZIP-bestand en pak het uit.

Als u alleen bepaalde bestanden wilt uitpakken en uitpakken, gebruikt u de methode extract().

Het eerste argument van de methode extract() is de naam van het uit te pakken bestand, en het tweede argument path is het pad van de map waarnaar het bestand moet worden uitgepakt. Als het path-argument wordt weggelaten, wordt het bestand uitgepakt in de huidige directory. De naam van het uit te pakken bestand moet het pad naar de directory in het ZIP-bestand bevatten, als het daar is opgeslagen.

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

Net als de extractall() methode, staat de extract() methode je ook toe om een wachtwoord op te geven als het argument pwd.

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