Compress and Extract ZIP and TAR Files with Python
Python includes built-in modules for working with compressed archives: zipfile for ZIP, tarfile for TAR/GZ/BZ2, and py7zr for 7-Zip. No external tools required.
ZIP with the zipfile Module
Create a ZIP file
import zipfile
from pathlib import Path
def compress_zip(files, output_zip):
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zf:
for f in files:
zf.write(f, arcname=Path(f).name)
print(f" Added: {f}")
print(f"ZIP created: {output_zip} ({Path(output_zip).stat().st_size/1024:.1f} KB)")
compress_zip(["report.pdf", "data.csv", "image.png"], "documents.zip")
Compress an entire folder
import zipfile
from pathlib import Path
def compress_folder(folder, output_zip):
folder = Path(folder)
with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zf:
for f in folder.rglob("*"):
if f.is_file():
zf.write(f, arcname=str(f.relative_to(folder.parent)))
size = Path(output_zip).stat().st_size / 1024 / 1024
print(f"ZIP: {output_zip} ({size:.2f} MB)")
compress_folder("my_project", "my_project.zip")
Extract ZIP files
import zipfile
def extract_zip(zip_path, dest="."):
with zipfile.ZipFile(zip_path, 'r') as zf:
for info in zf.infolist():
print(f" {info.filename} ({info.file_size/1024:.1f} KB)")
zf.extractall(dest)
print(f"Extracted to: {dest}")
extract_zip("documents.zip", "extracted/")
Password-protected ZIP
pip install pyzipper
import pyzipper, zipfile
with pyzipper.AESZipFile("protected.zip", 'w',
compression=zipfile.ZIP_DEFLATED,
encryption=pyzipper.WZ_AES) as zf:
zf.setpassword(b"my_secret_password")
zf.write("secret.pdf")
with pyzipper.AESZipFile("protected.zip") as zf:
zf.setpassword(b"my_secret_password")
zf.extractall("safe_output/")
TAR with the tarfile Module
Create TAR.GZ and TAR.BZ2
import tarfile
from pathlib import Path
def compress_tar(folder, output_base, mode="gz"):
# mode: "gz" (.tar.gz), "bz2" (.tar.bz2), "xz" (.tar.xz)
name = f"{output_base}.tar.{mode}"
with tarfile.open(name, f"w:{mode}") as tar:
tar.add(folder, arcname=Path(folder).name)
size = Path(name).stat().st_size / 1024 / 1024
print(f"TAR created: {name} ({size:.2f} MB)")
compress_tar("my_project", "project_backup", "gz")
compress_tar("my_project", "project_backup", "bz2")
Extract TAR
import tarfile
def extract_tar(tar_path, dest="."):
with tarfile.open(tar_path, 'r:*') as tar: # 'r:*' auto-detects compression
members = tar.getmembers()
print(f"Files in TAR: {len(members)}")
for m in members[:5]:
print(f" {m.name} ({m.size/1024:.1f} KB)")
tar.extractall(dest)
print(f"Extracted to: {dest}")
extract_tar("backup.tar.gz", "restored/")
7-Zip Files (py7zr)
pip install py7zr
import py7zr
from pathlib import Path
# Create 7z
with py7zr.SevenZipFile("archive.7z", "w") as szf:
szf.writeall("my_folder", "my_folder")
print(f"7z: {Path('archive.7z').stat().st_size/1024:.0f} KB")
# Extract 7z
with py7zr.SevenZipFile("archive.7z", "r") as szf:
szf.extractall("extracted/")
Compare Compression Ratios
import zipfile, tarfile, py7zr
from pathlib import Path
def compare_compression(folder):
original = sum(f.stat().st_size for f in Path(folder).rglob("*") if f.is_file())
print(f"Original: {original/1024/1024:.2f} MB")
results = []
# ZIP
with zipfile.ZipFile("t.zip", 'w', zipfile.ZIP_DEFLATED) as zf:
for f in Path(folder).rglob("*"):
if f.is_file(): zf.write(f, f.relative_to(Path(folder).parent))
results.append(("ZIP", Path("t.zip").stat().st_size))
# TAR.GZ
with tarfile.open("t.tar.gz", "w:gz") as t: t.add(folder)
results.append(("TAR.GZ", Path("t.tar.gz").stat().st_size))
# 7Z
with py7zr.SevenZipFile("t.7z", "w") as s: s.writeall(folder)
results.append(("7Z", Path("t.7z").stat().st_size))
for name, size in results:
ratio = (1 - size/original) * 100
print(f" {name:8}: {size/1024:.0f} KB (saved: {ratio:.1f}%)")
compare_compression("my_project")
Additional Resource
For converting files between ZIP, 7Z, RAR and other formats without any coding, use KaijuConverter — free and no registration required.
Related conversions
Archive format conversions used most often: