Comprimiendo y extrayendo ficheros con Python

Si has estado utilizando ordenadores desde hace tiempo, es probable que te hayas encontrado con archivos con la extensión zip. Son archivos especiales que contienen contenido comprimido de muchos otros archivos, carpetas y subcarpetas. Esto los hace muy útiles para transferir archivos por Internet. ¿Sabías que puedes utilizar Python para comprimir y extraer archivos?

En este tutorial te mostraré cómo utilizar el módulo zipfile en Python para extraer o comprimir tanto archivos individuales, como múltiples ficheros a la vez.

Comprimir archivos individuales

Esto es muy sencillo y requiere muy poco código. Empezamos importando el módulo zipfile y abrimos el fichero zip en modo escritura definiendo el segundo parámetro como 'w'. El primero parámetro es la ruta ruta al propio archivo. Este es el código que debes utilizar:

import zipfile
         
jungle_zip = zipfile.ZipFile('C:\Stories\Fantasy\jungle.zip', 'w')
jungle_zip.write('C:\Stories\Fantasy\jungle.pdf', compress_type=zipfile.ZIP_DEFLATED)
 
jungle_zip.close()

Puedes definir distintos métodos de compresión a la hora de comprimir archivos. Los nuevos métodos BZIP2 y LZMA se agregaron a Python en la versión 3.3, pero hay ciertas herramientas que no soportan estos dos métodos de compresión. Es por eso que lo más seguro es utilizar el método DEFLATED.

Comprimir múltiples ficheros

Esto es un poco más complejo ya que es necesario iterar sobre todos los archivos. El siguiente código debe comprimir todos los pdfs en una carpeta determinada:

import os
import zipfile
 
fantasy_zip = zipfile.ZipFile('C:\Stories\Fantasy\archive.zip', 'w')
 
for folder, subfolders, files in os.walk('C:\Stories\Fantasy'):
 
    for file in files:
        if file.endswith('.pdf'):
            fantasy_zip.write(os.path.join(folder, file), os.path.relpath(os.path.join(folder,file), 'C:\Stories\Fantasy'), compress_type = zipfile.ZIP_DEFLATED)
 
fantasy_zip.close()

Hemos importado el módulo os y hemos usado su método walk () para revisar todos los archivos y subcarpetas dentro de nuestra carpeta original. Sólo comprimo los archivos pdf en el directorio. También puedes crear diferentes ficheros archivados para cada formato utilizando instrucciones if.

Si no deseas conservar la estructura de directorios, puedes poner todos los archivos juntos utilizando la siguiente línea:

fantasy_zip.write(os.path.join(folder, file), file, compress_type = zipfile.ZIP_DEFLATED)

El método write() admite tres parámetros. El primer parámetro es el nombre del archivo que queremos comprimir. El segundo parámetro es opcional y permite especificar un nombre de archivo diferente para el archivo comprimido. Si no se especifica nada, se utiliza el nombre original.

Extrayendo todos los ficheros

Puedes utilizar el método extractall() para extraer todos los archivos y carpetas de un archivo zip en el directorio de trabajo actual. También puede pasarle un nombre de carpeta a extractall() para extraer todos los archivos y carpetas en un directorio específico. Si la carpeta que le pasaste no existe, este método creará una nueva. Aquí está el código que puedes utilizar para extraer archivos:

import zipfile
         
fantasy_zip = zipfile.ZipFile('C:\Stories\Fantasy\archive.zip')
fantasy_zip.extractall('C:\Library\Stories\Fantasy')
 
fantasy_zip.close()

Si quieres extraer varios archivos, debes proporcionale el nombre de los archivos que deseas extraer en una lista.

Extrayendo archivos individuales

Esto es muy similar a extraer múltiples ficheros. La única diferencia es que debes pasar el nombre del archivo primero y la ruta para extraerlos más atrde. Además, debes utilizar el método extract() en lugar de extractall(). Aquí tienes un snippet básico para extraer archivos individuales.

import zipfile
         
fantasy_zip = zipfile.ZipFile('C:\Stories\Fantasy\archive.zip')
fantasy_zip.extract('Fantasy Jungle.pdf', 'C:\Stories\Fantasy')
 
fantasy_zip.close()

Fuente: Monty Shokeen

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP