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.
- Relaterade artiklar:Komprimering av en katalog (mapp) till zip eller tar i Python
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')