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țiibackup.zip.zip.
Comenzi înrudite
shutil.copytree() și shutil.ignore_patterns(): Copiază un director întreg, cu toate subdirectoarele, opțional ignorând anumite fișiere.Path.iterdir(), glob(), rglob() și walk(): Parcurge conținutul unui director, cu sau fără subdirectoare, eventual filtrat după un model.