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.
- Kapcsolódó cikkek:Egy könyvtár (mappa) tömörítése zip vagy tar formátumba Pythonban
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')