zipfile a ZIP fájlok tömörítéséhez és kicsomagolásához Pythonban

Üzleti

A Python szabványos könyvtár zipfile modulja használható fájlok ZIP-be tömörítésére és ZIP fájlok kicsomagolására. A modul benne van a szabványos könyvtárban, így nincs szükség további telepítésre.

A következő tartalmakat ismertetjük.

  • Több fájl tömörítése egy ZIP fájlba
  • Új fájl hozzáadása egy meglévő ZIP fájlhoz
  • Egy könyvtár (mappa) ZIP-fájlba tömörítése
  • ZIP fájlba tömörítve, jelszóval ellátva
  • Ellenőrizze a ZIP-fájl tartalmát.
  • Csomagolja ki (kicsomagolja) a ZIP-fájl teljes tartalmát.
  • Válassza ki a ZIP-fájl tartalmát, és csomagolja ki.

Több fájl tömörítése egy ZIP fájlba

Hozzon létre egy ZipFile objektumot, és a write() metódus segítségével adja hozzá a tömöríteni kívánt fájlokat.

Új ZIP-fájl létrehozásához a ZipFile objektum konstruktorának első argumentumaként adjuk meg a létrehozandó ZIP-fájl elérési útvonalát, a második argumentumot pedig a következő módon'w'

Ezenkívül a tömörítési módszer is megadható harmadik argumentumként.

  • zipfile.ZIP_STORED:Csak kombináljon több fájlt tömörítés nélkül (alapértelmezett)
  • zipfile.ZIP_DEFLATED:Normál ZIP tömörítés (zlib modul szükséges)
  • zipfile.ZIP_BZIP2:BZIP2 tömörítés (bz2 modul szükséges)
  • zipfile.ZIP_LZMA:LZMA tömörítés (lzma modul szükséges)

A BZIP2 és az LZMA nagyobb tömörítési aránnyal rendelkezik (kisebb méretűre tömöríthető), de a tömörítéshez szükséges idő hosszabb.

Az write() metódusban az első argumentummal megadott fájl a második argumentummal megadott arcname ZIP fájlba íródik. Ha az arcname elmarad, a fájlnév változatlanul használatos. Az arcname megadhat egy könyvtárstruktúrát is.

A ZipFile objektumot a close() metódussal kell bezárni, de ha a with utasítást használja, akkor a blokk befejezésekor automatikusan bezáródik.

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

A write() metódus compress_type argumentumának megadásával az egyes fájlok tömörítési módját is ki lehet választani.

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

Új fájl hozzáadása egy meglévő ZIP fájlhoz

Ha új fájlt szeretne hozzáadni egy meglévő zip-fájlhoz, a ZipFile objektum létrehozásakor a konstruktor első argumentumát a meglévő zip-fájl elérési útvonalára kell beállítani. A második argumentum módját is állítsa be a következőképpen.'a'

Ezután, mint a fenti példában, csak hozzáadjuk a fájlt a write() metódus segítségével.

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

Egy könyvtár (mappa) ZIP-fájlba tömörítése

Ha egy teljes könyvtárat (mappát) egyetlen ZIP-fájlba akarsz tömöríteni, használhatod az os.scandir() vagy az os.listdir() parancsot a fájlok listájának elkészítéséhez, de egyszerűbb a shutil modulban található make_archive() parancsot használni.

Lásd a következő cikket.

ZIP fájlba tömörítve, jelszóval ellátva

A zipfile modul nem teszi lehetővé jelszóval védett ZIP-ek létrehozását. Ha egy fájlt jelszóval védett zip-fájlba akar tömöríteni, használja a harmadik féltől származó pyminizip könyvtárat.

Vegye figyelembe, hogy a jelszóval védett ZIP-ek dekompresszióját a zipfile modullal lehet elvégezni (lásd alább).

Ellenőrizze a ZIP-fájl tartalmát.

Ellenőrizheti egy meglévő ZIP-fájl tartalmát.

Létrehoz egy ZipFile objektumot úgy, hogy a konstruktor első argumentumaként a file-t a meglévő zip-fájl elérési útvonalára, a második argumentumként pedig a mode-t 'r' értékre állítja. A mode argumentum elhagyható, mivel az alapértelmezett az 'r'.

A ZipFile objektum namelist() metódusával lekérdezheti az archivált fájlok listáját.

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

Csomagolja ki (kicsomagolja) a ZIP-fájl teljes tartalmát.

Egy ZIP-fájl tartalmának kicsomagolásához hozzon létre egy ZipFile objektumot, amelynek első argumentuma a konstruktorban a fájl, mint a meglévő ZIP-fájl elérési útvonala, a második argumentum pedig az “r”, mint a fenti példában. A mode argumentum elhagyható, mivel alapértelmezés szerint 'r'.

A ZipFile objektum extractall() metódusa a ZIP-fájl teljes tartalmát kicsomagolja (kitömöríti). Az első argumentum, a path, megadja annak a könyvtárnak az elérési útvonalát, ahová a kivonatolás történjen. Ha elhagyja, akkor a fájlok az aktuális könyvtárba lesznek kicsomagolva.

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

Egy jelszóval ellátott ZIP-fájlt úgy lehet kinyerni, hogy az extractall() metódus pwd argumentumaként megadjuk a jelszót.

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

Válassza ki a ZIP-fájl tartalmát, és csomagolja ki.

Ha csak bizonyos fájlokat szeretne kicsomagolni és kicsomagolni, használja az extract() metódust.

Az extract() metódus első argumentuma az extrahálandó fájl neve, a második argumentum pedig a path a könyvtár elérési útvonala, ahová az extrahálás történjen. Ha a path argumentumot elhagyjuk, a fájl az aktuális könyvtárba lesz kicsomagolva. A kicsomagolandó fájl nevének tartalmaznia kell a ZIP-fájlban lévő könyvtár elérési útvonalát, ha az ott van tárolva.

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

Az extractall() módszerhez hasonlóan az extract() módszer is lehetővé teszi, hogy a pwd argumentumként jelszót adjon meg.

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