zipfile för att komprimera och avkomprimera ZIP-filer i Python

Företag

Modulen zipfile i Pythons standardbibliotek kan användas för att komprimera filer till ZIP-filer och packa upp ZIP-filer. Den ingår i standardbiblioteket, så ingen ytterligare installation krävs.

Följande innehåll förklaras.

  • Komprimera flera filer till en ZIP-fil
  • Lägg till en ny fil i en befintlig ZIP-fil
  • Komprimera en katalog (mapp) till en ZIP-fil
  • Komprimerad till en ZIP-fil med ett lösenord
  • Kontrollera innehållet i ZIP-filen.
  • Extrahera (packa upp) hela innehållet i ZIP-filen.
  • Välj innehållet i ZIP-filen och extrahera det.

Komprimera flera filer till en ZIP-fil

Skapa ett ZipFile-objekt och använd write()-metoden för att lägga till de filer du vill komprimera.

Om du vill skapa en ny ZIP-fil anger du sökvägen till den ZIP-fil som ska skapas som det första argumentet i konstruktören för ZipFile-objektet och det andra argumentet på följande sätt'w'

Dessutom kan komprimeringsmetoden anges som tredje argument.

  • zipfile.ZIP_STORED:Kombinera bara flera filer utan komprimering (standard)
  • zipfile.ZIP_DEFLATED:Normal ZIP-komprimering (zlib-modul krävs)
  • zipfile.ZIP_BZIP2:BZIP2-komprimering (bz2-modul krävs)
  • zipfile.ZIP_LZMA:LZMA-komprimering (lzma-modul krävs)

BZIP2 och LZMA har ett högre kompressionsförhållande (kan komprimeras till en mindre storlek), men det tar längre tid att komprimera.

I metoden write() skrivs filen med det första argumentet filnamn till en ZIP-fil med det andra argumentet arcname. Om arcname utelämnas används filnamn som det är. arcname kan också ange en katalogstruktur.

ZipFile-objektet måste stängas med metoden close(), men om du använder with-anvisningen stängs det automatiskt när blocket är avslutat.

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

Genom att ange argumentet compress_type i write()-metoden är det också möjligt att välja komprimeringsmetod för varje fil.

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

Lägg till en ny fil i en befintlig ZIP-fil

Om du vill lägga till en ny fil i en befintlig zip-fil anger du det första argumentet i konstruktören till sökvägen för den befintliga zip-filen när du skapar ZipFile-objektet. Ange även det andra argumentet som följande.'a'

Sedan, som i exemplet ovan, lägger du bara till filen med hjälp av write()-metoden.

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

Komprimera en katalog (mapp) till en ZIP-fil

Om du vill komprimera en hel katalog (mapp) till en enda ZIP-fil kan du använda os.scandir() eller os.listdir() för att göra en lista över filer, men det är enklare att använda make_archive() i shutil-modulen.

Se följande artikel.

Komprimerad till en ZIP-fil med ett lösenord

Modulen zipfile gör det inte möjligt att skapa lösenordsskyddade ZIP-filer. Om du vill komprimera en fil till en lösenordsskyddad zip-fil kan du använda tredjepartsbiblioteket pyminizip.

Observera att dekomprimering av lösenordsskyddade ZIP-filer kan göras med modulen zipfile (se nedan).

Kontrollera innehållet i ZIP-filen.

Du kan kontrollera innehållet i en befintlig ZIP-fil.

Skapa ett ZipFile-objekt genom att ställa in det första argumentet file i konstruktören till sökvägen för den befintliga zip-filen och det andra argumentet mode till ”r”. Argumentet mode kan utelämnas eftersom standardvärdet är ”r”.

Du kan använda metoden namelist() för ZipFile-objektet för att få en lista över arkiverade filer.

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

Extrahera (packa upp) hela innehållet i ZIP-filen.

För att packa upp innehållet i en ZIP-fil skapar du ett ZipFile-objekt med det första argumentet file i konstruktören som sökvägen till den befintliga ZIP-filen och det andra argumentet mode som ”r”, som i exemplet ovan. Argumentet mode kan utelämnas eftersom det är standardvärdet ”r”.

Metoden extractall() i ZipFile-objektet extraherar (avkomprimerar) hela innehållet i ZIP-filen. Det första argumentet, path, anger sökvägen till den katalog som ska extraheras till. Om det utelämnas kommer filerna att extraheras till den aktuella katalogen.

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

En ZIP-fil med ett lösenord kan extraheras genom att ange lösenordet som argument pwd i metoden extractall().

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

Välj innehållet i ZIP-filen och extrahera det.

Om du vill packa upp och extrahera endast vissa filer använder du metoden extract().

Det första argumentet i metoden extract() är namnet på filen som ska extraheras och det andra argumentet path är sökvägen till den katalog som ska extraheras. Om path-argumentet utelämnas kommer filen att extraheras till den aktuella katalogen. Namnet på den fil som ska extraheras ska innehålla sökvägen till katalogen i ZIP-filen om den är lagrad där.

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

Liksom metoden extractall() gör metoden extract() det också möjligt att ange ett lösenord som 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