objectif
Compresser quelques fichiers et les extraire proprement.
code minimal
from zipfile import ZipFile, ZIP_DEFLATED
from tempfile import TemporaryDirectory
from pathlib import Path
with TemporaryDirectory() as tmp:
root = Path(tmp)
(root / "a.txt").write_text("A\n", encoding="utf-8")
(root / "b.txt").write_text("B\n", encoding="utf-8")
zip_path = root / "files.zip"
with ZipFile(zip_path, "w", ZIP_DEFLATED) as z:
z.write(root / "a.txt", arcname="a.txt")
z.write(root / "b.txt", arcname="b.txt")
with ZipFile(zip_path) as z:
z.extractall(root / "out")
print((root / "out" / "a.txt").read_text().strip()) # attendu: A
utilisation
from zipfile import ZipFile
import io
buf = io.BytesIO()
with ZipFile(buf, "w") as z: pass
print(buf.getbuffer().nbytes >= 22) # ZIP minimal
variante(s) utile(s)
from zipfile import ZipFile, ZIP_STORED
from io import BytesIO
mem = BytesIO()
with ZipFile(mem, "w", compression=ZIP_STORED) as z:
z.writestr("x.txt", "hello")
print(mem.getbuffer().nbytes > 0)
notes
- ZIP_DEFLATED compresse; ZIP_STORED garde en clair.
- Évitez d’extraire des chemins suspects (path traversal) non vérifiés.