Zipfile modul standardne biblioteke Python može se koristiti za komprimiranje datoteka u ZIP-ove i dekomprimiranje ZIP datoteka. Uključen je u standardnu biblioteku, tako da nije potrebna dodatna instalacija.
Objašnjeni su sljedeći sadržaji.
- Komprimirajte više datoteka u ZIP datoteku
- Dodajte novu datoteku postojećoj ZIP datoteci
- Komprimirajte direktorij (mapu) u ZIP datoteku
- Komprimirano u ZIP datoteku s lozinkom
- Provjerite sadržaj ZIP datoteke.
- Izdvojite (otpakirajte) cijeli sadržaj ZIP datoteke.
- Odaberite sadržaj ZIP datoteke i raspakirajte ga.
- Komprimirajte više datoteka u ZIP datoteku
- Dodajte novu datoteku postojećoj ZIP datoteci
- Komprimirajte direktorij (mapu) u ZIP datoteku
- Komprimirano u ZIP datoteku s lozinkom
- Provjerite sadržaj ZIP datoteke.
- Izdvojite (otpakirajte) cijeli sadržaj ZIP datoteke.
- Odaberite sadržaj ZIP datoteke i raspakirajte ga.
Komprimirajte više datoteka u ZIP datoteku
Napravite ZipFile objekt i upotrijebite metodu write() za dodavanje datoteka koje želite komprimirati.
Da biste stvorili novu ZIP datoteku, navedite put ZIP datoteke koja će se stvoriti kao prvi argument konstruktora ZipFile objekta, a drugi argument kako slijediw'
Osim toga, metoda kompresije može se navesti kao treći argument.
zipfile.ZIP_STORED
:Samo kombinirajte više datoteka bez kompresije (zadano)zipfile.ZIP_DEFLATED
:Normalna ZIP kompresija (potreban zlib modul)zipfile.ZIP_BZIP2
:BZIP2 kompresija (potreban bz2 modul)zipfile.ZIP_LZMA
:LZMA kompresija (potreban lzma modul)
BZIP2 i LZMA imaju veći omjer kompresije (mogu se komprimirati na manju veličinu), ali je vrijeme potrebno za kompresiju duže.
U metodi write(), datoteka s prvim argumentom filename se upisuje u ZIP datoteku s drugim argumentom arcname. Ako je naziv luka izostavljen, naziv datoteke se koristi kakav jest. arcname također može specificirati strukturu direktorija.
Objekt ZipFile treba zatvoriti metodom close(), ali ako koristite with naredbu, automatski će se zatvoriti kada se blok završi.
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')
Određivanjem argumenta compress_type metode write(), također je moguće odabrati metodu kompresije za svaku datoteku.
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')
Dodajte novu datoteku postojećoj ZIP datoteci
Da biste dodali novu datoteku postojećoj zip datoteci, postavite prvi argument konstruktora na putanju postojeće zip datoteke prilikom kreiranja objekta ZipFile. Također, postavite način drugog argumenta na sljedeći način.a'
Zatim, kao u gornjem primjeru, samo dodajte datoteku pomoću metode write().
with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
existing_zip.write('data/temp/test4.txt', arcname='test4.txt')
Komprimirajte direktorij (mapu) u ZIP datoteku
Ako želite komprimirati cijeli direktorij (mapu) u jednu ZIP datoteku, možete koristiti os.scandir() ili os.listdir() da napravite popis datoteka, ali lakše je koristiti make_archive() u shutil modul.
Pogledajte sljedeći članak.
- Povezani članci:Komprimiranje direktorija (mape) u zip ili tar u Pythonu
Komprimirano u ZIP datoteku s lozinkom
Modul zipfile ne dopušta vam stvaranje ZIP-ova zaštićenih lozinkom. Ako želite komprimirati datoteku u zip datoteku zaštićenu lozinkom, upotrijebite biblioteku treće strane pyminizip.
Imajte na umu da se dekompresija ZIP-ova zaštićenih lozinkom može obaviti pomoću modula zipfile (vidi dolje).
Provjerite sadržaj ZIP datoteke.
Možete provjeriti sadržaj postojeće ZIP datoteke.
Stvorite ZipFile objekt postavljanjem prve datoteke argumenta u konstruktoru na stazu postojeće zip datoteke, a način drugog argumenta na ‘r’. Argument načina se može izostaviti jer je zadana vrijednost ‘r’.
Možete koristiti metodu namelist() objekta ZipFile da biste dobili popis arhiviranih datoteka.
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']
Izdvojite (otpakirajte) cijeli sadržaj ZIP datoteke.
Da biste raspakirali sadržaj ZIP datoteke, stvorite ZipFile objekt s prvim argumentom u konstruktoru kao stazom do postojeće ZIP datoteke i načinom drugog argumenta kao ‘r’, kao u gornjem primjeru. Argument načina se može izostaviti jer je zadana vrijednost ‘r’.
Metoda extractall() objekta ZipFile izdvaja (dekomprimira) cijeli sadržaj ZIP datoteke. Prvi argument, put, specificira put direktorija u koji se izdvaja. Ako je izostavljen, datoteke će se ekstrahirati u trenutni direktorij.
with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
existing_zip.extractall('data/temp/ext')
ZIP datoteka s lozinkom može se izdvojiti navođenjem lozinke kao argumenta pwd metode extractall().
with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
pass_zip.extractall('data/temp/ext_pass', pwd='password')
Odaberite sadržaj ZIP datoteke i raspakirajte ga.
Ako želite raspakirati i izdvojiti samo određene datoteke, koristite metodu extract().
Prvi argument metode extract() je naziv datoteke za ekstrahiranje, a put drugog argumenta je put direktorija u koji se ekstrahira. Ako je argument puta izostavljen, datoteka će se ekstrahirati u trenutni direktorij. Naziv datoteke koja se ekstrahira trebao bi uključivati put do direktorija u ZIP datoteci ako je tamo pohranjena.
with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
existing_zip.extract('test1.txt', 'data/temp/ext2')
Kao i metoda extractall(), metoda extract() također vam omogućuje da navedete lozinku kao 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')