zipfile për të kompresuar dhe çkompresuar skedarët ZIP në Python

biznes

Moduli zipfile i bibliotekës standarde Python mund të përdoret për të kompresuar skedarët në ZIP dhe për të çkompresuar skedarët ZIP. Është përfshirë në bibliotekën standarde, kështu që nuk kërkohet instalim shtesë.

Përmbajtja e mëposhtme shpjegohet.

  • Kompresoni skedarë të shumtë në një skedar ZIP
  • Shtoni një skedar të ri në një skedar ekzistues ZIP
  • Kompresoni një direktori (dosje) në një skedar ZIP
  • Kompresuar në një skedar ZIP me një fjalëkalim
  • Kontrolloni përmbajtjen e skedarit ZIP.
  • Ekstraktoni (zhpaketoni) të gjithë përmbajtjen e skedarit ZIP.
  • Zgjidhni përmbajtjen e skedarit ZIP dhe ekstraktoni atë.

Kompresoni skedarë të shumtë në një skedar ZIP

Krijoni një objekt ZipFile dhe përdorni metodën write() për të shtuar skedarët që dëshironi të kompresoni.

Për të krijuar një skedar të ri ZIP, specifikoni shtegun e skedarit ZIP që do të krijohet si argumenti i parë i konstruktorit të objektit ZipFile dhe argumenti i dytë si më poshtëw'

Përveç kësaj, metoda e kompresimit mund të specifikohet si argumenti i tretë.

  • zipfile.ZIP_STORED:Thjesht kombinoni skedarë të shumtë pa kompresim (parazgjedhja)
  • zipfile.ZIP_DEFLATED:Kompresim normal ZIP (kërkohet moduli zlib)
  • zipfile.ZIP_BZIP2:Kompresimi BZIP2 (kërkohet moduli bz2)
  • zipfile.ZIP_LZMA:Kompresimi LZMA (kërkohet moduli lzma)

BZIP2 dhe LZMA kanë një raport më të lartë kompresimi (mund të kompresohen në një madhësi më të vogël), por koha e nevojshme për kompresim është më e gjatë.

Në metodën write(), skedari me emrin e skedarit të argumentit të parë shkruhet në një skedar ZIP me emrin e argumentit të dytë. Nëse emri i harkut hiqet, emri i skedarit përdoret si është. Arcname gjithashtu mund të specifikojë një strukturë drejtorie.

Objekti ZipFile duhet të mbyllet me metodën close(), por nëse përdorni deklaratën with, ai do të mbyllet automatikisht kur të përfundojë blloku.

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

Duke specifikuar argumentin compress_type të metodës write(), është gjithashtu e mundur të zgjidhet metoda e kompresimit për çdo skedar.

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

Shtoni një skedar të ri në një skedar ekzistues ZIP

Për të shtuar një skedar të ri në një skedar ekzistues zip, vendosni argumentin e parë të konstruktorit në shtegun e skedarit zip ekzistues kur krijoni objektin ZipFile. Gjithashtu, vendosni mënyrën e dytë të argumentit si më poshtë.a'

Pastaj, si në shembullin e mësipërm, thjesht shtoni skedarin duke përdorur metodën write().

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

Kompresoni një direktori (dosje) në një skedar ZIP

Nëse dëshironi të kompresoni një dosje (dosje) të tërë në një skedar të vetëm ZIP, mund të përdorni os.scandir() ose os.listdir() për të bërë një listë skedarësh, por është më e lehtë të përdorni make_archive() në shutil modul.

Shihni artikullin e mëposhtëm.

Kompresuar në një skedar ZIP me një fjalëkalim

Moduli zipfile nuk ju lejon të krijoni ZIP të mbrojtura me fjalëkalim. Nëse dëshironi të kompresoni një skedar në një skedar zip të mbrojtur me fjalëkalim, përdorni bibliotekën e palës së tretë pyminizip.

Vini re se dekompresimi i ZIP-ve të mbrojtura me fjalëkalim mund të bëhet me modulin zipfile (shih më poshtë).

Kontrolloni përmbajtjen e skedarit ZIP.

Ju mund të kontrolloni përmbajtjen e një skedari ekzistues ZIP.

Krijoni një objekt ZipFile duke vendosur skedarin e parë të argumentit në konstruktor në shtegun e skedarit zip ekzistues dhe modalitetin e dytë të argumentit në ‘r’. Argumenti i modalitetit mund të hiqet pasi parazgjedhja është ‘r’.

Ju mund të përdorni metodën namelist() të objektit ZipFile për të marrë një listë të skedarëve të arkivuar.

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

Ekstraktoni (zhpaketoni) të gjithë përmbajtjen e skedarit ZIP.

Për të shpaketuar përmbajtjen e një skedari ZIP, krijoni një objekt ZipFile me skedarin e parë të argumentit në konstruktor si shtegun për në skedarin ekzistues ZIP dhe modalitetin e dytë të argumentit si ‘r’, si në shembullin e mësipërm. Argumenti i modalitetit mund të hiqet pasi është i paracaktuar në ‘r’.

Metoda extractall() e objektit ZipFile ekstrakton (çkompreson) të gjithë përmbajtjen e skedarit ZIP. Argumenti i parë, rruga, specifikon shtegun e drejtorisë për të nxjerrë. Nëse hiqet, skedarët do të nxirren në drejtorinë aktuale.

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

Një skedar ZIP me një fjalëkalim mund të nxirret duke specifikuar fjalëkalimin si argument pwd të metodës extractall().

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

Zgjidhni përmbajtjen e skedarit ZIP dhe ekstraktoni atë.

Nëse dëshironi të shpaketoni dhe ekstraktoni vetëm skedarë të caktuar, përdorni metodën ekstrakt().

Argumenti i parë i metodës ekstrakt() është emri i skedarit për t’u nxjerrë, dhe shtegu i dytë i argumentit është shtegu i drejtorisë ku duhet nxjerrë. Nëse argumenti i rrugës hiqet, skedari do të nxirret në drejtorinë aktuale. Emri i skedarit që do të nxirret duhet të përfshijë shtegun drejt drejtorisë në skedarin ZIP nëse ruhet atje.

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

Ashtu si metoda extractall(), edhe metoda extract() ju lejon të specifikoni një fjalëkalim si 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