zipfile para comprimir y descomprimir archivos ZIP en Python

Negocio

El módulo zipfile de la biblioteca estándar de Python puede utilizarse para comprimir archivos en ZIP y descomprimir archivos ZIP. Está incluido en la biblioteca estándar, por lo que no se requiere ninguna instalación adicional.

Se explican los siguientes contenidos.

  • Comprimir varios archivos en un archivo ZIP
  • Añadir un nuevo archivo a un archivo ZIP existente
  • Comprimir un directorio (carpeta) en un archivo ZIP
  • Comprimido en un archivo ZIP con contraseña
  • Compruebe el contenido del archivo ZIP.
  • Extraiga (descomprima) todo el contenido del archivo ZIP.
  • Seleccione el contenido del archivo ZIP y extráigalo.

Comprimir varios archivos en un archivo ZIP

Crea un objeto ZipFile y utiliza el método write() para añadir los archivos que quieras comprimir.

Para crear un nuevo archivo ZIP, especifique la ruta del archivo ZIP a crear como primer argumento del constructor del objeto ZipFile, y el segundo argumento de la siguiente manera'w'

Además, se puede especificar el método de compresión como tercer argumento.

  • zipfile.ZIP_STORED:Sólo combina varios archivos sin compresión (por defecto)
  • zipfile.ZIP_DEFLATED:Compresión ZIP normal (se requiere el módulo zlib)
  • zipfile.ZIP_BZIP2:Compresión BZIP2 (se requiere el módulo bz2)
  • zipfile.ZIP_LZMA:Compresión LZMA (se requiere el módulo lzma)

BZIP2 y LZMA tienen una mayor relación de compresión (pueden comprimirse a un tamaño menor), pero el tiempo requerido para la compresión es mayor.

En el método write(), el archivo con el primer argumento filename se escribe en un archivo ZIP con el segundo argumento arcname. Si se omite arcname, el archivo se utiliza tal cual. arcname también puede especificar una estructura de directorios.

El objeto ZipFile debe cerrarse con el método close(), pero si se utiliza la sentencia with, se cerrará automáticamente cuando termine el bloque.

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

Al especificar el argumento compress_type del método write(), también es posible seleccionar el método de compresión para cada archivo.

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

Añadir un nuevo archivo a un archivo ZIP existente

Para añadir un nuevo archivo a un archivo zip existente, establezca el primer argumento del constructor a la ruta del archivo zip existente al crear el objeto ZipFile. Además, establezca el modo del segundo argumento de la siguiente manera.'a'

Entonces, como en el ejemplo anterior, sólo hay que añadir el archivo utilizando el método write().

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

Comprimir un directorio (carpeta) en un archivo ZIP

Si quiere comprimir todo un directorio (carpeta) en un solo archivo ZIP, puede usar os.scandir() u os.listdir() para hacer una lista de archivos, pero es más fácil usar make_archive() en el módulo shutil.

Véase el siguiente artículo.

Comprimido en un archivo ZIP con contraseña

El módulo zipfile no permite crear ZIPs protegidos por contraseña. Si desea comprimir un archivo en un archivo zip protegido por contraseña, utilice la biblioteca de terceros pyminizip.

Tenga en cuenta que la descompresión de los ZIPs protegidos por contraseña puede hacerse con el módulo zipfile (ver más abajo).

Compruebe el contenido del archivo ZIP.

Puede comprobar el contenido de un archivo ZIP existente.

Crea un objeto ZipFile estableciendo el primer argumento file en el constructor a la ruta del archivo zip existente y el segundo argumento mode a 'r'. El argumento mode puede omitirse ya que el valor por defecto es 'r'.

Puede utilizar el método namelist() del objeto ZipFile para obtener una lista de los ficheros archivados.

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

Extraiga (descomprima) todo el contenido del archivo ZIP.

Para descomprimir el contenido de un archivo ZIP, cree un objeto ZipFile con el primer argumento file en el constructor como la ruta al archivo ZIP existente y el segundo argumento mode como 'r', como en el ejemplo anterior. El argumento mode puede omitirse, ya que su valor por defecto es «r».

El método extractall() del objeto ZipFile extrae (descomprime) todo el contenido del archivo ZIP. El primer argumento, path, especifica la ruta del directorio al que se extrae. Si se omite, los archivos se extraerán al directorio actual.

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

Un archivo ZIP con contraseña puede ser extraído especificando la contraseña como argumento pwd del método extractall().

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

Seleccione el contenido del archivo ZIP y extráigalo.

Si quieres desempaquetar y extraer sólo ciertos archivos, utiliza el método extract().

El primer argumento del método extract() es el nombre del archivo a extraer, y el segundo argumento path es la ruta del directorio a extraer. Si se omite el argumento path, el archivo se extraerá en el directorio actual. El nombre del archivo a extraer debe incluir la ruta del directorio en el archivo ZIP si está almacenado allí.

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

Al igual que el método extractall(), el método extract() también permite especificar una contraseña como argumento 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