Comprimir archivos con el módulo zipfile en Python

Es posible que esté familiarizado con los archivos ZIP (con la extensión de archivo .zip ), que contienen los archivos y carpetas comprimido. La compresión de un archivo reduce su tamaño, lo que es útil cuando se transfiere por Internet. Y dado que un archivo ZIP también puede contener varios archivos y subcarpetas, es una forma práctica de empaquetar varios archivos en uno. Este archivo único, llamado archivo de almacenamiento , se puede adjuntar, por ejemplo, a un correo electrónico.

Sus programas Python pueden crear y abrir (o extraer ) archivos ZIP usando funciones en el módulo zipfile. Supongamos que tiene un archivo ZIP llamado ejemplo.zip que tiene el contenido que se muestra en la Figura 10-2 .

imagen

Figura 10-2: El contenido de ejemplo.zip

Siga este tutorial usando un archivo ZIP que ya este en su computadora.

Para leer el contenido de un archivo ZIP, primero debe crear un objeto ZipFile (tenga en cuenta las letras mayúsculas Z y F ). Los objetos ZipFile son conceptualmente similares a los objetos File que vio devueltos por la función open() en Lectura y escritura de archivos en Python: son valores a través de los cuales el programa interactúa con el archivo. Para crear un objeto ZipFile , llame a la función zipfile.ZipFile(), pasándole una cadena del nombre de archivo del archivo .ZIPTenga en cuenta que zipfile es el nombre del módulo de Python y ZipFile() es el nombre de la función.

Por ejemplo, ingrese lo siguiente en el shell interactivo:

   >>> import zipfile, os

   >>> from pathlib import Path
   >>> p = Path.home()
   >>> exampleZip = zipfile.ZipFile(p / 'example.zip')
   >>> exampleZip.namelist()
   ['spam.txt', 'cats/', 'cats/catnames.txt', 'cats/zophie.jpg']
   >>> spamInfo = exampleZip.getinfo('spam.txt')
   >>> spamInfo.file_size
   13908
   >>> spamInfo.compress_size
   3828
➊ >>> f'Compressed file is {round(spamInfo.file_size / spamInfo
   .compress_size, 2)}x smaller!'
   )
   'Compressed file is 3.63x smaller!'
   >>> exampleZip.close()

Un objeto ZipFile tiene un método namelist() que devuelve una lista de cadenas para todos los archivos y carpetas contenidos en el archivo ZIP. Estas cadenas se pueden pasar al método ZipFile getinfo() para devolver un objeto ZipInfo sobre ese archivo en particular. Los objetos ZipInfo tienen sus propios atributos, como file_size y compress_size en bytes, que contienen números enteros del tamaño del archivo original y el tamaño del archivo comprimido, respectivamente. Mientras que un objeto ZipFile representa un archivo completo, un objeto ZipInfo contiene información útil sobre un solo archivo en el archivo.

El comando en ➊ calcula la eficacia con la que se comprime example.zip dividiendo el tamaño del archivo original por el tamaño del archivo comprimido e imprime esta información.

El método extractall() para objetos ZipFile extrae todos los archivos y carpetas de un archivo ZIP en el directorio de trabajo actual.

  >>> import zipfile, os
   >>> from pathlib import Path
   >>> p = Path.home()
   >>> exampleZip = zipfile.ZipFile(p / 'example.zip')
➊ >>> exampleZip.extractall()
   >>> exampleZip.close()

Después de ejecutar este código, el contenido de example.zip se extraerá en C:\ . Opcionalmente, puede pasar un nombre de carpeta a extractall() para que extraiga los archivos en una carpeta que no sea el directorio de trabajo actual. Si la carpeta pasada al método extractall() no existe, se creará. Por ejemplo, si reemplazaste la llamada en ➊ con exampleZip.extractall('C:\\delicious') , el código extraería los archivos de example.zip en una carpeta C:\delicious recién creada .

El método extract() para objetos ZipFile extraerá un solo archivo del archivo ZIP. 

Continúe con el ejemplo de shell interactivo:

>>> ejemploZip.extract('spam.txt')
'C:\\spam.txt'
>>> ejemploZip.extract('spam.txt', 'C:\\algunas\\nuevas\\carpetas')
' C:\\algunas\\nuevas\\carpetas\\spam.txt'
>>> ejemploZip.close()

La cadena que pase a extract() debe coincidir con una de las cadenas de la lista devuelta por namelist(). Opcionalmente, puede pasar un segundo argumento a extract() para extraer el archivo en una carpeta que no sea el directorio de trabajo actual. Si este segundo argumento es una carpeta que aún no existe, Python creará la carpeta. El valor que devuelve extract() es la ruta absoluta a la que se extrajo el archivo.

Para crear sus propios archivos ZIP comprimidos, debe abrir el objeto ZipFile en modo de escritura pasando 'w' como segundo argumento. (Esto es similar a abrir un archivo de texto en modo de escritura pasando 'w' a la función open() ).

Cuando pasa una ruta al método write() de un objeto ZipFile, Python comprimirá el archivo en esa ruta y lo agregará al archivo ZIP. El primer argumento del método write() es una cadena del nombre del archivo que se va a agregar. El segundo argumento es el parámetro del tipo de compresión, que le dice a la computadora qué algoritmo debe usar para comprimir los archivos; siempre puede establecer este valor en zipfile.ZIP_DEFLATED. (Esto especifica el algoritmo de compresión desinflar , que funciona bien en todo tipo de datos). Ingrese lo siguiente en el shell interactivo:

>>> import zipfile
>>> newZip = zipfile.ZipFile('new.zip', 'w')
>>> newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)
>>> newZip.close()

Este código creará un nuevo archivo ZIP llamado new.zip que tiene el contenido comprimido de spam.txt .

Tenga en cuenta que, al igual que con la escritura en archivos, el modo de escritura borrará todo el contenido existente de un archivo ZIP. Si desea simplemente agregar archivos a un archivo ZIP existente, pase 'a' como segundo argumento a zipfile.ZipFile() para abrir el archivo ZIP en modo de adición .

Deja una respuesta