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) :
Le modèle - Rapport moral du président d’association en PDF - qui se lit facilement,…
Exemple clair, prêt à télécharger, pour présenter votre activité avec un rendu premium Une présentation…
On croit souvent qu’un frigo “fait le job” tant qu’il est froid au moment où…
Visualiser les forces réelles d’une équipe ne relève plus de l’intuition lorsqu’une matrice des compétences…
Comprendre, structurer et rédiger un document fondateur clair, crédible et inspirant Rédiger les statuts d’une…
Gérez les pannes, bugs, coupures réseau et alertes sécurité avec une procédure claire, structurée et…
This website uses cookies.