zipfile per comprimir i descomprimir fitxers ZIP a Python

Negocis

El mòdul zipfile de la biblioteca estàndard de Python es pot utilitzar per comprimir fitxers en ZIP i descomprimir fitxers ZIP. S’inclou a la biblioteca estàndard, de manera que no cal cap instal·lació addicional.

S’expliquen els continguts següents.

  • Comprimiu diversos fitxers en un fitxer ZIP
  • Afegiu un fitxer nou a un fitxer ZIP existent
  • Comprimiu un directori (carpeta) en un fitxer ZIP
  • Comprimit en un fitxer ZIP amb una contrasenya
  • Comproveu el contingut del fitxer ZIP.
  • Extraieu (descomprimiu) tot el contingut del fitxer ZIP.
  • Seleccioneu el contingut del fitxer ZIP i extreu-lo.

Comprimiu diversos fitxers en un fitxer ZIP

Creeu un objecte ZipFile i utilitzeu el mètode write() per afegir els fitxers que voleu comprimir.

Per crear un fitxer ZIP nou, especifiqueu la ruta del fitxer ZIP que s’ha de crear com a primer argument del constructor de l’objecte ZipFile i el segon argument de la manera següentw'

A més, el mètode de compressió es pot especificar com a tercer argument.

  • zipfile.ZIP_STORED:Només heu de combinar diversos fitxers sense compressió (per defecte)
  • zipfile.ZIP_DEFLATED:Compressió ZIP normal (requereix el mòdul zlib)
  • zipfile.ZIP_BZIP2:Compressió BZIP2 (requereix el mòdul bz2)
  • zipfile.ZIP_LZMA:Compressió LZMA (requereix el mòdul lzma)

BZIP2 i LZMA tenen una relació de compressió més alta (es pot comprimir a una mida més petita), però el temps necessari per a la compressió és més llarg.

En el mètode write(), el fitxer amb el primer argument nom de fitxer s’escriu en un fitxer ZIP amb el segon argument nom d’arc. Si s’omet arcname, el nom de fitxer s’utilitza tal qual. arcname també pot especificar una estructura de directoris.

L’objecte ZipFile s’ha de tancar amb el mètode close(), però si feu servir la instrucció with, es tancarà automàticament quan finalitzi el bloc.

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

En especificar l’argument compress_type del mètode write(), també és possible seleccionar el mètode de compressió per a cada fitxer.

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

Afegiu un fitxer nou a un fitxer ZIP existent

Per afegir un fitxer nou a un fitxer zip existent, establiu el primer argument del constructor a la ruta del fitxer zip existent quan creeu l’objecte ZipFile. A més, configureu el segon mode d’argument de la manera següent.a'

A continuació, com a l’exemple anterior, només cal afegir el fitxer mitjançant el mètode write().

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

Comprimiu un directori (carpeta) en un fitxer ZIP

Si voleu comprimir tot un directori (carpeta) en un únic fitxer ZIP, podeu utilitzar os.scandir() o os.listdir() per fer una llista de fitxers, però és més fàcil utilitzar make_archive() al shutil. mòdul.

Consulteu l’article següent.

Comprimit en un fitxer ZIP amb una contrasenya

El mòdul zipfile no us permet crear ZIP protegits amb contrasenya. Si voleu comprimir un fitxer en un fitxer zip protegit amb contrasenya, utilitzeu la biblioteca de tercers pyminizip.

Tingueu en compte que la descompressió dels ZIP protegits amb contrasenya es pot fer amb el mòdul zipfile (vegeu més avall).

Comproveu el contingut del fitxer ZIP.

Podeu comprovar el contingut d’un fitxer ZIP existent.

Creeu un objecte ZipFile establint el primer fitxer d’arguments del constructor a la ruta del fitxer zip existent i el segon mode d’argument a “r”. L’argument mode es pot ometre ja que el valor per defecte és ‘r’.

Podeu utilitzar el mètode namelist() de l’objecte ZipFile per obtenir una llista de fitxers arxivats.

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

Extraieu (descomprimiu) tot el contingut del fitxer ZIP.

Per desempaquetar el contingut d’un fitxer ZIP, creeu un objecte ZipFile amb el primer fitxer d’arguments del constructor com a camí d’accés al fitxer ZIP existent i el segon mode d’argument com a “r”, com a l’exemple anterior. L’argument mode es pot ometre ja que el valor predeterminat és ‘r’.

El mètode extractall() de l’objecte ZipFile extreu (descomprimeix) tot el contingut del fitxer ZIP. El primer argument, ruta, especifica la ruta del directori al qual s’extreu. Si s’omet, els fitxers s’extreuran al directori actual.

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

Es pot extreure un fitxer ZIP amb una contrasenya especificant la contrasenya com a argument pwd del mètode extractall().

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

Seleccioneu el contingut del fitxer ZIP i extreu-lo.

Si voleu desempaquetar i extreure només alguns fitxers, feu servir el mètode extract().

El primer argument del mètode extract() és el nom del fitxer que s’ha d’extreure, i el segon argument camí és el camí del directori per extreure. Si s’omet l’argument camí, el fitxer s’extreu al directori actual. El nom del fitxer que s’ha d’extreure ha d’incloure la ruta del directori al fitxer ZIP si s’hi guarda.

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

Igual que el mètode extractall(), el mètode extract() també us permet especificar una contrasenya com a 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