Pickle est la bibliothèque standard de Python pour sérialiser (convertir en octets) et désérialiser (recréer) des objets. C’est rapide, pratique, et fidèle à la structure interne des objets Python… mais ce n’est pas un format d’échange universel ni sécurisé contre les contenus malveillants. Ce guide va à l’essentiel : quand l’utiliser, comment l’utiliser proprement, et comment éviter les pièges.
⚠️ Sécurité
N’ouvrez jamais un fichier pickle dont vous n’êtes pas l’auteur ou que vous ne validez pas cryptographiquement.pickle.load()peut exécuter du code lors du chargement.
À utiliser si…
À éviter si…
pickle.HIGHEST_PROTOCOL = le plus efficace).import pickle
data = {"clients": ["Ali", "Nora"], "total": 245.90, "paid": True}
# Écriture binaire
with open("data.pkl", "wb") as f:
pickle.dump(data, f, protocol=pickle.HIGHEST_PROTOCOL)
# Lecture binaire
with open("data.pkl", "rb") as f:
loaded = pickle.load(f)
print(loaded)
Bon réflexe : utilisez systématiquement protocol=pickle.HIGHEST_PROTOCOL.
import pickle
objs = [{"id": 1}, {"id": 2}, {"id": 3}]
with open("multi.pkl", "wb") as f:
for o in objs:
pickle.dump(o, f, protocol=pickle.HIGHEST_PROTOCOL)
# Relire jusqu'à la fin du flux
items = []
with open("multi.pkl", "rb") as f:
try:
while True:
items.append(pickle.load(f))
except EOFError:
pass
print(items)
import gzip, pickle
big_array = list(range(200_000))
with gzip.open("data.pkl.gz", "wb") as f:
pickle.dump(big_array, f, protocol=pickle.HIGHEST_PROTOCOL)
with gzip.open("data.pkl.gz", "rb") as f:
restored = pickle.load(f)
💡 Astuce perf
Compressez surtout les données “texte” ou peu entropiques. Pour des tableaux numériques lourds, regardez NumPy (.npy/.npz) ou Parquet.
from dataclasses import dataclass
import pickle
@dataclass
class Facture:
numero: str
client: str
montant: float
# Attribut non sérialisable (ex: connexion) -> exclu via __getstate__/__setstate__
_cache = None
def __getstate__(self):
state = self.__dict__.copy()
state.pop("_cache", None) # on retire ce qu'on ne veut pas pickler
return state
def __setstate__(self, state):
self.__dict__.update(state)
self._cache = {} # on re-initialise au chargement
fact = Facture("F2025-001", "ACME", 1299.0)
with open("facture.pkl", "wb") as f:
pickle.dump(fact, f, protocol=pickle.HIGHEST_PROTOCOL)
with open("facture.pkl", "rb") as f:
fact2 = pickle.load(f)
print(fact2)
À retenir
__getstate__/__setstate__ permettent de contrôler finement ce qui est stocké.Comme Pickle reflète vos structures Python, faites évoluer vos objets sans casser :
import pickle
PAYLOAD_VERSION = 2
def dump_factures(path, factures):
payload = {"version": PAYLOAD_VERSION, "items": factures}
with open(path, "wb") as f:
pickle.dump(payload, f, protocol=pickle.HIGHEST_PROTOCOL)
def load_factures(path):
with open(path, "rb") as f:
payload = pickle.load(f)
v = payload.get("version", 1)
items = payload["items"]
if v == 1:
# Migration -> v2 (ex : renommer un champ, ajouter une clé, etc.)
for it in items:
it.setdefault("devise", "EUR")
v = 2
return items
Bonnes pratiques migration
version au niveau racine.Pickle ne sécurise pas le contenu. Pour s’assurer que le fichier n’a pas été altéré, associez-y une signature HMAC avec une clé secrète :
import hmac, hashlib, pickle
SECRET = b"changez-moi-une-fois-pour-toutes" # stockez-la hors dépôt git
def dumps_signed(obj: object) -> tuple[bytes, bytes]:
data = pickle.dumps(obj, protocol=pickle.HIGHEST_PROTOCOL)
sig = hmac.new(SECRET, data, hashlib.sha256).digest()
return data, sig
def loads_signed(data: bytes, sig: bytes):
exp = hmac.new(SECRET, data, hashlib.sha256).digest()
if not hmac.compare_digest(exp, sig):
raise ValueError("Signature invalide (fichier altéré ou clé incorrecte)")
return pickle.loads(data)
# Exemple d'usage
payload = {"version": 1, "items": [1,2,3]}
data, sig = dumps_signed(payload)
obj = loads_signed(data, sig) # ok
🔐 Cela garantit l’intégrité et l’authenticité, pas la confidentialité.
Pour chiffrer, combinez HMAC + chiffrement (ex. viacryptography.fernet).
protocol=pickle.HIGHEST_PROTOCOL..npy/.npz, Parquet, Feather).pickle est utilisé en coulisse ; gardez les fonctions et classes au niveau module.protocol=pickle.HIGHEST_PROTOCOL ?version + migrations testées) ?Pickle est-il lisible par d’autres langages ?
Non. C’est un format Python-centré. Pour l’échange, utilisez JSON/Parquet.
Puis-je pickler des objets NumPy/pandas ?
Oui, mais pour l’efficacité et la portabilité, préférez les formats natifs (.npy/.npz, Parquet).
Mes pickles Python 3.12 seront-ils lisibles en 3.8 ?
Souvent oui si vous restez sur des types simples, mais ce n’est pas garanti. Testez et documentez les versions minimales.
Comment diagnostiquer un pickle cassé ?
import gzip, hmac, hashlib, pickle
from typing import Any
SECRET = b"...votre-cle-secrete..." # gérez-la comme un secret applicatif
def dump_secure(obj: Any, path: str, version: int) -> None:
payload = {"version": version, "data": obj}
raw = pickle.dumps(payload, protocol=pickle.HIGHEST_PROTOCOL)
sig = hmac.new(SECRET, raw, hashlib.sha256).digest()
with gzip.open(path, "wb") as f:
f.write(len(sig).to_bytes(2, "big") + sig + raw)
def load_secure(path: str) -> dict:
with gzip.open(path, "rb") as f:
sig_len = int.from_bytes(f.read(2), "big")
sig = f.read(sig_len)
raw = f.read()
exp = hmac.new(SECRET, raw, hashlib.sha256).digest()
if not hmac.compare_digest(exp, sig):
raise ValueError("Signature invalide")
return pickle.loads(raw) # -> {"version": X, "data": ...}
Cette recette combine compression, intégrité HMAC et versioning minimal, ce qui couvre 95 % des usages professionnels de Pickle tout en limitant les risques.
Cabinet Lemoine & Associés, à Nantes, suit 120 TPE/PME (boulangeries, artisans du bâtiment, e-commerce). Chaque fin de mois, l’équipe récupère :
Le goulot : à chaque itération, les mêmes traitements lourds (nettoyage, typage, jointures) sont refaits, alors que 90 % des données n’ont pas changé. Objectif : accélérer la clôture sans dégrader la traçabilité (audit) ni enfreindre le RGPD.
version) afin de gérer les évolutions./dossiers_clients/
C001_BoulangerieRivière/
source/
banque_2025-08.csv
ventes_2025-08.xlsx
cache/
ETP_clean_v2.pkl.gz # Pickle compressé et signé
journal_v2.pkl.gz
livrables/
balance_agee_2025-08.xlsx
ventes_parquet_2025-08.parquet
import gzip, hmac, hashlib, pickle
from pathlib import Path
from typing import Any
SECRET = b"cle-secrete-a-stocker-hors-git" # .env / vault
def dump_secure(obj: Any, path: Path, version: int) -> None:
payload = {"version": version, "data": obj}
raw = pickle.dumps(payload, protocol=pickle.HIGHEST_PROTOCOL)
sig = hmac.new(SECRET, raw, hashlib.sha256).digest()
path.parent.mkdir(parents=True, exist_ok=True)
with gzip.open(path, "wb") as f:
f.write(len(sig).to_bytes(2, "big") + sig + raw)
def load_secure(path: Path) -> dict:
with gzip.open(path, "rb") as f:
sig_len = int.from_bytes(f.read(2), "big")
sig = f.read(sig_len)
raw = f.read()
exp = hmac.new(SECRET, raw, hashlib.sha256).digest()
if not hmac.compare_digest(exp, sig):
raise ValueError("Signature invalide (fichier altéré ?)")
return pickle.loads(raw)
def checksum_files(*paths: Path) -> str:
h = hashlib.sha256()
for p in paths:
h.update(p.read_bytes())
return h.hexdigest()[:16] # court mais suffisant pour invalider
def cache_path_for(client_dir: Path, name: str, version: int, sig: str) -> Path:
return client_dir / "cache" / f"{name}_v{version}_{sig}.pkl.gz"
import pandas as pd
SCHEMA_VERSION = 2
def load_sources(client_dir: Path):
src = client_dir / "source"
banque = pd.read_csv(src / "banque_2025-08.csv")
ventes = pd.read_excel(src / "ventes_2025-08.xlsx")
return banque, ventes
def clean_pipeline(banque: pd.DataFrame, ventes: pd.DataFrame):
# Typages & normalisations (exemples)
banque["date"] = pd.to_datetime(banque["date"], dayfirst=True, errors="coerce")
ventes["date_facture"] = pd.to_datetime(ventes["date_facture"], dayfirst=True, errors="coerce")
ventes["montant_ttc"] = ventes["montant_ttc"].astype("float64")
# Pseudonymisation légère des emails clients pour le cache (RGPD)
if "email" in ventes.columns:
ventes["email_hash"] = ventes["email"].fillna("").map(
lambda s: hashlib.sha256(s.encode()).hexdigest()[:10]
)
ventes = ventes.drop(columns=["email"]) # on évite de stocker l'email en clair dans le pickle
# Jointure illustrative
ventes["mois"] = ventes["date_facture"].dt.to_period("M")
kpis = ventes.groupby("mois", as_index=False)["montant_ttc"].sum().rename(columns={"montant_ttc":"CA_mensuel"})
return {"banque_clean": banque, "ventes_clean": ventes, "kpis": kpis}
def run_for_client(client_dir: Path):
banque, ventes = load_sources(client_dir)
sig = checksum_files(client_dir/"source/banque_2025-08.csv",
client_dir/"source/ventes_2025-08.xlsx")
pkl = cache_path_for(client_dir, "journal", SCHEMA_VERSION, sig)
if pkl.exists():
payload = load_secure(pkl)
if payload["version"] == SCHEMA_VERSION:
print("→ Cache chargé :", pkl.name)
return payload["data"]
# sinon, on recalcule (migration possible)
data = clean_pipeline(banque, ventes)
dump_secure(data, pkl, SCHEMA_VERSION)
print("→ Cache écrit :", pkl.name)
return data
def export_livrables(client_dir: Path, data: dict):
liv = client_dir / "livrables"
liv.mkdir(exist_ok=True, parents=True)
# Exports stables inter-outils
data["kpis"].to_parquet(liv / "ventes_kpis_2025-08.parquet", index=False)
with pd.ExcelWriter(liv / "balance_agee_2025-08.xlsx", engine="xlsxwriter") as xw:
data["ventes_clean"].to_excel(xw, sheet_name="Ventes", index=False)
data["banque_clean"].to_excel(xw, sheet_name="Banque", index=False)
source/.run_for_client() (script batch par portefeuille).Même approche pour une boutique Shopify/Prestashop : pickler le catalogue enrichi (produits + mapping TVA + familles), recalculer uniquement si l’export produits change, et publier les KPIs en Parquet pour Power BI.
version + fonctions de migration.gzip), ou préférer Parquet pour les DataFrames denses.version et une procédure de migration.
Pickle est un outil de persistance interne extrêmement pratique pour Python : rapide, fidèle et simple. Utilisez-le en conscience : jamais sur des sources non fiables, toujours avec versioning et, idéalement, signe/ chiffrez vos fichiers. Pour l’échange inter-outils et le long terme, basculez vers des formats ouverts (JSON/Parquet).
Téléchargez simplement Python, et vous aurez pickle :
pickle : guide officiel (EN) et version FR. (Python documentation)Option “tout-en-un” pour data (inclut Python et l’écosystème scientifique) :
Deux outils concrets pour piloter la qualité sans alourdir vos équipes Cette page met à…
Un chantier se gagne souvent avant même l’arrivée des équipes. Quand tout est clair dès…
Le mariage a du sens quand il repose sur une décision libre, mûrie et partagée.…
Une étude de cas réussie commence par une structure sûre. Ce modèle Word vous guide…
Les soft skills se repèrent vite sur une fiche, mais elles ne pèsent vraiment que…
Outil de comparaison et repérage des offres étudiantes Choisir des verres progressifs ressemble rarement à…
This website uses cookies.