zipfile pentru a comprima și decomprima fișiere ZIP în Python

Afaceri

Modulul zipfile din biblioteca standard Python poate fi utilizat pentru a comprima fișiere în fișiere ZIP și pentru a decomprima fișiere ZIP. Acesta este inclus în biblioteca standard, deci nu este necesară o instalare suplimentară.

Sunt explicate următoarele conținuturi.

  • Comprimați mai multe fișiere într-un fișier ZIP
  • Adăugați un nou fișier la un fișier ZIP existent
  • Comprimarea unui director (folder) într-un fișier ZIP
  • Comprimat într-un fișier ZIP cu o parolă
  • Verificați conținutul fișierului ZIP.
  • Extrageți (despachetați) întregul conținut al fișierului ZIP.
  • Selectați conținutul fișierului ZIP și extrageți-l.

Comprimați mai multe fișiere într-un fișier ZIP

Creați un obiect ZipFile și utilizați metoda write() pentru a adăuga fișierele pe care doriți să le comprimați.

Pentru a crea un nou fișier ZIP, specificați calea fișierului ZIP care urmează să fie creat ca prim argument al constructorului obiectului ZipFile, iar al doilea argument după cum urmează'w'

În plus, metoda de compresie poate fi specificată ca al treilea argument.

  • zipfile.ZIP_STORED:Doar combină mai multe fișiere fără compresie (implicit)
  • zipfile.ZIP_DEFLATED:Compresie ZIP normală (este necesar modulul zlib)
  • zipfile.ZIP_BZIP2:Compresie BZIP2 (este necesar modulul bz2)
  • zipfile.ZIP_LZMA:Compresie LZMA (este necesar modulul lzma)

BZIP2 și LZMA au un raport de compresie mai mare (pot fi comprimate la o dimensiune mai mică), dar timpul necesar pentru compresie este mai mare.

În metoda write(), fișierul cu primul argument filename este scris într-un fișier ZIP cu al doilea argument arcname. În cazul în care numele de fișier este omis, numele de fișier este utilizat ca atare. arcname poate specifica, de asemenea, o structură de directoare.

Obiectul ZipFile trebuie să fie închis cu metoda close(), dar dacă folosiți instrucțiunea with, acesta va fi închis automat când blocul este terminat.

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

Prin specificarea argumentului compress_type al metodei write(), este posibilă, de asemenea, selectarea metodei de compresie pentru fiecare fișier.

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

Adăugați un nou fișier la un fișier ZIP existent

Pentru a adăuga un nou fișier la un fișier zip existent, setați primul argument al constructorului la calea de acces a fișierului zip existent atunci când creați obiectul ZipFile. De asemenea, setați modul celui de-al doilea argument după cum urmează.'a'

Apoi, ca în exemplul de mai sus, trebuie doar să adăugați fișierul folosind metoda write().

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

Comprimarea unui director (folder) într-un fișier ZIP

Dacă doriți să comprimați un întreg director (folder) într-un singur fișier ZIP, puteți utiliza os.scandir() sau os.listdir() pentru a crea o listă de fișiere, dar este mai ușor să utilizați make_archive() din modulul shutil.

A se vedea următorul articol.

Comprimat într-un fișier ZIP cu o parolă

Modulul zipfile nu vă permite să creați fișiere ZIP protejate prin parolă. Dacă doriți să comprimați un fișier într-un fișier zip protejat prin parolă, utilizați biblioteca terță parte pyminizip.

Rețineți că descompactarea fișierelor ZIP protejate prin parolă se poate face cu ajutorul modulului zipfile (a se vedea mai jos).

Verificați conținutul fișierului ZIP.

Puteți verifica conținutul unui fișier ZIP existent.

Creați un obiect ZipFile prin setarea primului argument file în constructor la calea fișierului zip existent și a celui de-al doilea argument mode la „r”. Argumentul „mode” poate fi omis, deoarece valoarea implicită este „r”.

Puteți utiliza metoda namelist() a obiectului ZipFile pentru a obține o listă de fișiere arhivate.

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

Extrageți (despachetați) întregul conținut al fișierului ZIP.

Pentru a despacheta conținutul unui fișier ZIP, creați un obiect ZipFile cu primul argument file în constructor ca fiind calea către fișierul ZIP existent și al doilea argument mode ca „r”, ca în exemplul de mai sus. Argumentul „mode” poate fi omis, deoarece este implicit „r”.

Metoda extractall() a obiectului ZipFile extrage (decomprimă) întregul conținut al fișierului ZIP. Primul argument, path, specifică calea directorului în care se face extragerea. Dacă este omis, fișierele vor fi extrase în directorul curent.

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

Un fișier ZIP cu o parolă poate fi extras prin specificarea parolei ca argument pwd al metodei extractall().

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

Selectați conținutul fișierului ZIP și extrageți-l.

Dacă doriți să despachetați și să extrageți doar anumite fișiere, utilizați metoda extract().

Primul argument al metodei extract() este numele fișierului care urmează să fie extras, iar al doilea argument calea este calea directorului în care se face extragerea. În cazul în care argumentul path este omis, fișierul va fi extras în directorul curent. Numele fișierului care urmează să fie extras trebuie să includă calea de acces la directorul din fișierul ZIP, în cazul în care acesta este stocat acolo.

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

La fel ca metoda extractall(), metoda extract() vă permite, de asemenea, să specificați o parolă ca 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