Comprimir y Descomprimir Archivos ZIP y TAR con Python
Python incluye módulos nativos para trabajar con archivos comprimidos: zipfile para ZIP, tarfile para TAR/GZ/BZ2, y py7zr para 7-Zip. No se necesitan herramientas externas.
ZIP con el módulo zipfile
Crear un archivo ZIP
import zipfile
from pathlib import Path
def comprimir_zip(archivos, salida_zip):
with zipfile.ZipFile(salida_zip, 'w', zipfile.ZIP_DEFLATED) as zf:
for archivo in archivos:
zf.write(archivo, arcname=Path(archivo).name)
print(f" Agregado: {archivo}")
print(f"ZIP creado: {salida_zip} ({Path(salida_zip).stat().st_size/1024:.1f} KB)")
comprimir_zip(["informe.pdf", "datos.csv", "imagen.png"], "documentos.zip")
Comprimir una carpeta completa
import zipfile
from pathlib import Path
def comprimir_carpeta(carpeta, salida_zip):
carpeta = Path(carpeta)
with zipfile.ZipFile(salida_zip, 'w', zipfile.ZIP_DEFLATED) as zf:
for archivo in carpeta.rglob("*"):
if archivo.is_file():
arcname = archivo.relative_to(carpeta.parent)
zf.write(archivo, arcname=str(arcname))
size = Path(salida_zip).stat().st_size / 1024 / 1024
print(f"ZIP: {salida_zip} ({size:.2f} MB)")
comprimir_carpeta("mi_proyecto", "mi_proyecto.zip")
Extraer archivos ZIP
import zipfile
from pathlib import Path
def extraer_zip(zip_path, destino="."):
with zipfile.ZipFile(zip_path, 'r') as zf:
# Ver contenido antes de extraer
for info in zf.infolist():
print(f" {info.filename} ({info.file_size/1024:.1f} KB)")
zf.extractall(destino)
print(f"Extraído en: {destino}")
extraer_zip("documentos.zip", "extraidos/")
ZIP con contraseña
import zipfile
# Crear ZIP protegido (solo lectura; para escritura usar pyzipper)
import pyzipper
with pyzipper.AESZipFile("protegido.zip", 'w',
compression=zipfile.ZIP_DEFLATED,
encryption=pyzipper.WZ_AES) as zf:
zf.setpassword(b"mi_contrasena_secreta")
zf.write("secreto.pdf")
# Extraer ZIP protegido
with pyzipper.AESZipFile("protegido.zip") as zf:
zf.setpassword(b"mi_contrasena_secreta")
zf.extractall("extraido_seguro/")
TAR con el módulo tarfile
Crear archivos TAR.GZ y TAR.BZ2
import tarfile
from pathlib import Path
def comprimir_tar(carpeta, salida, modo="gz"):
# modo: "gz" (.tar.gz), "bz2" (.tar.bz2), "xz" (.tar.xz)
nombre = f"{salida}.tar.{modo}"
with tarfile.open(nombre, f"w:{modo}") as tar:
tar.add(carpeta, arcname=Path(carpeta).name)
size = Path(nombre).stat().st_size / 1024 / 1024
print(f"TAR creado: {nombre} ({size:.2f} MB)")
comprimir_tar("mi_proyecto", "backup_proyecto", "gz")
comprimir_tar("mi_proyecto", "backup_proyecto", "bz2")
Extraer TAR
import tarfile
def extraer_tar(tar_path, destino="."):
with tarfile.open(tar_path, 'r:*') as tar: # 'r:*' detecta compresión
miembros = tar.getmembers()
print(f"Archivos en TAR: {len(miembros)}")
for m in miembros[:5]:
print(f" {m.name} ({m.size/1024:.1f} KB)")
tar.extractall(destino)
print(f"Extraído en: {destino}")
extraer_tar("backup.tar.gz", "restaurado/")
Archivos 7-Zip (py7zr)
pip install py7zr
import py7zr
from pathlib import Path
# Crear 7z
with py7zr.SevenZipFile("archivo.7z", "w") as szf:
szf.writeall("mi_carpeta", "mi_carpeta")
print(f"7z creado: {Path('archivo.7z').stat().st_size/1024:.0f} KB")
# Extraer 7z
with py7zr.SevenZipFile("archivo.7z", "r") as szf:
szf.extractall("extraido/")
Comparar Ratios de Compresión
import zipfile, tarfile, py7zr, os
from pathlib import Path
def comparar_compresion(carpeta):
original = sum(f.stat().st_size for f in Path(carpeta).rglob("*") if f.is_file())
print(f"Original: {original/1024/1024:.2f} MB")
formatos = [
("ZIP DEFLATE", "out.zip", lambda: comprimir_zip_r(carpeta, "out.zip")),
("TAR.GZ", "out.tar.gz", lambda: comprimir_tar_r(carpeta, "out.tar.gz")),
("7Z", "out.7z", lambda: comprimir_7z_r(carpeta, "out.7z")),
]
for nombre, archivo, fn in formatos:
fn()
size = Path(archivo).stat().st_size
ratio = (1 - size/original) * 100
print(f" {nombre:12}: {size/1024:.0f} KB (ahorro: {ratio:.1f}%)")
def comprimir_zip_r(src, dst):
with zipfile.ZipFile(dst, 'w', zipfile.ZIP_DEFLATED) as zf:
for f in Path(src).rglob("*"):
if f.is_file(): zf.write(f, f.relative_to(Path(src).parent))
def comprimir_tar_r(src, dst):
with tarfile.open(dst, "w:gz") as t: t.add(src)
def comprimir_7z_r(src, dst):
with py7zr.SevenZipFile(dst, "w") as s: s.writeall(src)
Recurso Adicional
Para convertir archivos entre ZIP, 7Z, RAR y otros formatos sin instalar nada, usa KaijuConverter — gratis y sin registro.
Conversiones relacionadas
Conversiones de archivos comprimidos más usadas: