zipfile za stiskanje in raztiskanje datotek ZIP v Pythonu

Posel

Modul zipfile standardne knjižnice Python lahko uporabite za stiskanje datotek v datoteke ZIP in raztiskanje datotek ZIP. Vključen je v standardno knjižnico, zato dodatna namestitev ni potrebna.

Pojasnjene so naslednje vsebine.

  • Stisnite več datotek v datoteko ZIP
  • Dodajanje nove datoteke v obstoječo datoteko ZIP
  • Stiskanje imenika (mape) v datoteko ZIP
  • stisnjeno v datoteko ZIP z geslom
  • Preverite vsebino datoteke ZIP.
  • Izvlecite (razpakirajte) celotno vsebino datoteke ZIP.
  • Izberite vsebino datoteke ZIP in jo razširite.

Stisnite več datotek v datoteko ZIP

Ustvarite predmet ZipFile in z metodo write() dodajte datoteke, ki jih želite stisniti.

Če želite ustvariti novo datoteko ZIP, kot prvi argument konstruktorja objekta ZipFile navedite pot do datoteke ZIP, ki jo želite ustvariti, drugi argument pa je naslednji'w'

Poleg tega lahko kot tretji argument navedete metodo stiskanja.

  • zipfile.ZIP_STORED:Združite več datotek brez stiskanja (privzeto)
  • zipfile.ZIP_DEFLATED:Običajno stiskanje ZIP (potreben je modul zlib)
  • zipfile.ZIP_BZIP2:stiskanje BZIP2 (potreben je modul bz2)
  • zipfile.ZIP_LZMA:stiskanje LZMA (potreben je modul lzma)

BZIP2 in LZMA imata večjo stopnjo stiskanja (lahko se stisneta na manjšo velikost), vendar je čas, potreben za stiskanje, daljši.

V metodi write() se datoteka s prvim argumentom ime datoteke zapiše v datoteko ZIP z drugim argumentom ime loka. Če je arcname izpuščen, se ime datoteke uporabi tako, kot je. arcname lahko določa tudi imeniško strukturo.

Objekt ZipFile je treba zapreti z metodo close(), če pa uporabite stavek with, se bo zaprl samodejno, ko bo blok končan.

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

Z navedbo argumenta compress_type v metodi write() lahko izberete tudi metodo stiskanja za vsako datoteko.

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

Dodajanje nove datoteke v obstoječo datoteko ZIP

Če želite obstoječi datoteki zip dodati novo datoteko, ob ustvarjanju objekta ZipFile nastavite prvi argument konstruktorja na pot obstoječe datoteke zip. Nastavite tudi način drugega argumenta, kot sledi.'a'

Nato, kot v zgornjem primeru, dodajte datoteko z metodo write().

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

Stiskanje imenika (mape) v datoteko ZIP

Če želite celoten imenik (mapo) stisniti v eno samo datoteko ZIP, lahko uporabite os.scandir() ali os.listdir() za izdelavo seznama datotek, vendar je lažje uporabiti make_archive() v modulu shutil.

Oglejte si naslednji članek.

stisnjeno v datoteko ZIP z geslom

Modul zipfile ne omogoča ustvarjanja datotek ZIP, zaščitenih z geslom. Če želite datoteko stisniti v datoteko ZIP, zaščiteno z geslom, uporabite knjižnico tretje osebe pyminizip.

Upoštevajte, da lahko dekompresijo ZIP-ov, zaščitenih z geslom, izvedete z modulom zipfile (glejte spodaj).

Preverite vsebino datoteke ZIP.

Preverite vsebino obstoječe datoteke ZIP.

Ustvari predmet ZipFile tako, da prvi argument datoteka v konstruktorju nastavi na pot obstoječe datoteke zip, drugi argument način pa na 'r'. Argument način je lahko izpuščen, saj je privzeta vrednost 'r'.

Za pridobitev seznama arhiviranih datotek lahko uporabite metodo namelist() predmeta 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']

Izvlecite (razpakirajte) celotno vsebino datoteke ZIP.

Če želite razpakirati vsebino datoteke ZIP, ustvarite predmet ZipFile, pri čemer je prvi argument datoteka v konstruktorju pot do obstoječe datoteke ZIP, drugi argument način pa 'r', kot v zgornjem primeru. Argument način lahko izpustite, saj je privzeta vrednost 'r'.

Metoda extractall() objekta ZipFile izvleče (raztegne) celotno vsebino datoteke ZIP. Prvi argument, pot, določa pot do imenika, v katerega se bo datoteka razširila. Če ga izpustite, se datoteke izločijo v trenutni imenik.

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

Datoteko ZIP z geslom lahko izvlečete tako, da v metodi extractall() kot argument pwd navedete geslo.

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

Izberite vsebino datoteke ZIP in jo razširite.

Če želite razpakirati in izvleči samo določene datoteke, uporabite metodo extract().

Prvi argument metode extract() je ime datoteke, ki jo želite izpisati, drugi argument path pa je pot do imenika, v katerega želite izpisati. Če je argument pot izpuščen, bo datoteka izpisana v trenutni imenik. Ime datoteke, ki jo je treba izvleči, mora vključevati pot do imenika v datoteki ZIP, če je v njem shranjena.

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

Tako kot metoda extractall() tudi metoda extract() omogoča, da kot argument pwd navedete geslo.

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