shutil.make_archive() și shutil.unpack_archive() în Python

Copiere și arhive (shutil) Python 3.2+ (filter: 3.12+, zstdtar: 3.14+)

Creează și dezarhivează arhive zip și tar dintr-o singură comandă.

Sintaxă
shutil.make_archive(nume_baza, format, root_dir=None)
shutil.unpack_archive(fisier, extract_dir=None, format=None, *, filter=None)

Ce face shutil.make_archive() și shutil.unpack_archive()

make_archive("backup", "zip", "proiect") creează backup.zip cu conținutul directorului proiect. Formatele disponibile se văd cu get_archive_formats(): zip, tar, gztar, bztar, xztar și, din 3.14, zstdtar.

unpack_archive() extrage o arhivă, ghicind formatul după extensie. Pentru arhive tar din surse nesigure, dă filter="data" (implicit din 3.14), care blochează căile periculoase. get_unpack_formats() listează formatele de extragere, iar register_archive_format()/unregister_archive_format() și register_unpack_format()/unregister_unpack_format() adaugă sau scot formate proprii.

Parametri

Parametru Descriere
nume_baza Numele arhivei, fără extensie.
format 'zip', 'gztar' etc.
root_dir Directorul arhivat.
extract_dir Unde se extrage.

Ce returnează

make_archive: calea arhivei. unpack_archive: None.

Exemple

Exemplul 1: Arhivare și dezarhivare

import shutil
from pathlib import Path
Path("proiect/date").mkdir(parents=True)
Path("proiect/main.py").write_text("print(1)")
Path("proiect/date/a.csv").write_text("x,y")
arhiva = shutil.make_archive("backup", "zip", root_dir="proiect")
print(arhiva.rsplit("/", 1)[-1])
shutil.unpack_archive("backup.zip", "restaurat")
print(sorted(str(p) for p in Path("restaurat").rglob("*")))
print([nume for nume, _ in shutil.get_archive_formats()])
print([(nume, ext) for nume, ext, _ in shutil.get_unpack_formats()][:2])

Rezultat

backup.zip
['restaurat/date', 'restaurat/date/a.csv', 'restaurat/main.py']
['bztar', 'gztar', 'tar', 'xztar', 'zip', 'zstdtar']
[('bztar', ['.tar.bz2', '.tbz2']), ('gztar', ['.tar.gz', '.tgz'])]

Exemplul 2: Format propriu

import shutil
def arhiveaza_text(nume_baza, root_dir, **kw):
    cale = nume_baza + ".lista"
    with open(cale, "w") as f:
        f.write("arhivă simulată\n")
    return cale
shutil.register_archive_format("lista", arhiveaza_text, description="listă de test")
print("lista" in dict(shutil.get_archive_formats()))
shutil.unregister_archive_format("lista")
shutil.register_unpack_format("lista", [".lista"], lambda f, d: None)
print(shutil.get_unpack_formats()[-1][:2])
shutil.unregister_unpack_format("lista")

Rezultat

True
('zstdtar', ['.tar.zst', '.tzst'])

Greșeli frecvente

  • Dai extensia în nume_baza ("backup.zip") și obții backup.zip.zip.

Comenzi înrudite