Apprenez en lisant dans l'ordre

pickle et base64 — Sérialisation d'objets et conversion binaire-vers-texte

pickle.dumps / loads transforment un dict ou une classe maison en bytes puis restaurent à l'identique, et base64.b64encode / b64decode font passer des données binaires par un canal texte.

Nous couvrirons deux modules utilisés lorsqu'on déplace des données à travers des fichiers ou sur le réseau. pickle sauve des objets Python (dicts, instances de classe, etc.) sous une forme qui peut être entièrement restaurée plus tard, tandis que base64 convertit des données binaires comme images ou audio en une chaîne d'"alphanumériques plus deux symboles" pour pouvoir l'insérer directement dans un e-mail, du JSON ou des URLs. Les deux sont des modules de la bibliothèque standard pour la conversion de données aux frontières internes ou aux transports externes.

Démêler à quoi sert chaque module

Les deux modules se séparent naturellement par combinaison entrée/sortie. Utilise le diagramme ci-dessous pour saisir la vue d'ensemble, puis nous creuserons les usages typiques et les API dans chaque section.

Rôles des deux modules
pickleobjet ↔ bytesinterne / entre processbase64binaire ↔ ASCIItransport (JSON/mail)
pickle fait objet ↔ bytes (stockage interne, entre processus) ; base64 fait binaire ↔ texte ASCII (conversion de transport : JSON / mail / URLs). Leurs cas d'usage ne se chevauchent pas, donc tu les combineras parfois.

pickle — Convertir des objets Python directement en bytes

pickle est un module de la bibliothèque standard qui convertit des objets Python en une forme qui peut être entièrement restaurée plus tard. Le résultat est une valeur bytes (une séquence contiguë d'entiers de 0 à 255 — un type pour gérer des "séquences de nombres" plutôt que des "séquences de caractères" comme les chaînes). Les bytes sont le format de base pour les situations où ce sont des machines, pas des humains, qui liront les données — sauvegarde dans des fichiers, envoi sur le réseau, transmission de données à un autre processus.

Quatre usages typiques de pickle
sauver modèle MLfichiers model.pkltransfert interprocessmultiprocessingcache de calculéviter le travail lourdfile de tâchesCelery déplace les args
Sauvegarde de modèles ML / transfert d'objets entre processus / mise en cache de calculs coûteux / files de tâches. Le point commun est qu'ils restent tous dans le monde Python — pour parler avec l'extérieur, utilise json.

Contrairement à json, la force de pickle est de pouvoir sauver non seulement dicts / lists / chaînes / nombres mais aussi des instances de classes personnalisées et des objets fonction, ce qui le rend utile pour sauver des modèles ML ou passer des objets entre processus Python.

Symétrie de pickle.dumps / loads
objet Python(dict / instance / etc.)pickle.dumpsbytes(forme binaire)bytes(forme binaire)pickle.loadsobjet Python(dict / instance / etc.)écrirelire
Ligne du haut : dumps = direction objet Python → bytes. Ligne du bas : loads = direction bytes → objet Python. Contrairement à json, les instances de classes personnalisées sont préservées telles quelles, mais la valeur de retour est bytes, pas du texte (donc pour écrire dans un fichier, ouvrir en mode binaire "wb" / "rb").

Ne fais jamais loads sur des données pickle venant d'ailleurs

pickle.loads peut exécuter du code Python arbitraire, donc lui passer des bytes provenant d'une source non fiable devient une vulnérabilité d'exécution de code arbitraire. Limite-toi aux scénarios "je l'ai créé, je le relis" et n'utilise jamais pickle sur des données reçues du réseau ou de quelqu'un d'autre. Pour la communication externe, utilise json à la place.

FonctionRôleNotes
pickle.dumps(obj)objet Python → bytesretourne des bytes (pas str)
pickle.loads(b)bytes → objet Pythonsources de confiance uniquement
pickle.dump(obj, file)écrire dans un fichierouvrir en mode binaire open(..., "wb")
pickle.load(file)lire depuis un fichierouvrir en mode binaire open(..., "rb")

Convertis un dictionnaire de scores en bytes avec pickle et vérifie le type de retour. Les bytes de pickle peuvent varier en longueur selon les environnements, donc on vérifiera via type.

① Importe le module pickle.

② Prépare le dictionnaire {"name": "Alice", "scores": [80, 90, 75]} dans une variable nommée data.

③ Convertis data en bytes avec pickle, stocke dans pickled, et affiche le nom du type sous la forme Type : ◯◯ (ce devrait être bytes).

(Si tu exécutes correctement, une explication apparaîtra.)

Éditeur Python

Exécuter le code pour voir le résultat

Restaure le pickled créé à la Pratique 1 en un objet Python et vérifie qu'il correspond exactement à data original. Les variables data et pickled de la Pratique 1 sont toujours disponibles, donc tu n'as qu'à écrire l'étape de restauration.

④ Restaure pickled avec pickle.loads dans une variable nommée restored.

⑤ Affiche Nom restauré : ◯◯ (le champ name de l'objet restauré) et Égal à l'original : True / False pour la vérification d'égalité.

Éditeur Python

Exécuter le code pour voir le résultat

base64 — Faire transiter des données binaires à travers du texte

base64 est un module qui convertit des données binaires arbitraires en une chaîne d'"alphanumériques plus deux symboles". Comme 3 octets deviennent 4 caractères, la taille augmente d'environ 1.33×, mais il est largement utilisé dans les situations où tu dois faire passer des données binaires à travers des canaux texte uniquement, comme les pièces jointes d'e-mail, l'intégration d'images dans du JSON ou des URLs, ou le stockage de bytes dans SQL.

Les deux API de base :

FonctionEntréeRetourne
base64.b64encode(bytes)bytes (les données source)bytes encodés en Base64
base64.b64decode(Base64)bytes / str (forme Base64)les bytes d'origine
Quatre usages typiques de base64
image dans JSON / HTMLdata:image/png;base64,…pièces jointes d'e-mailmécanisme MIMEtokens JWT(auth web)encodage du payloadcerts en variables d'envdonnées multi-lignes sur 1 ligne
Intégration d'images dans JSON / HTML (data URLs) / pièces jointes d'e-mail (MIME) / payloads de tokens JWT (JSON Web Token — un token d'authentification web qui transporte des infos utilisateur avec détection d'altération) / mettre des certificats dans des variables d'environnement ou des fichiers de config. Le point commun est de faire passer du binaire à travers des canaux texte uniquement.
Comment fonctionne base64
données binairesb"Python is fun!"b64encodechaîne Base64UHl0aG9uIGlzIGZ1biE=chaîne Base64UHl0aG9uIGlzIGZ1biE=b64decodedonnées binairesb"Python is fun!"encodedecode
Ligne du haut : encode = direction données binaires → chaîne Base64. Ligne du bas : decode = direction chaîne Base64 → données binaires d'origine. En interne, 3 octets sont découpés en quatre morceaux de 6 bits mappés sur A–Z / a–z / 0–9 / + / / (64 caractères) ; le nombre de caractères grandit à 4/3 de l'original, avec = comme padding pour combler.
import base64

# bytes → Base64
binary = b"Python is fun!"
encoded = base64.b64encode(binary)
print(encoded)              # b'UHl0aG9uIGlzIGZ1biE='
print(encoded.decode())     # UHl0aG9uIGlzIGZ1biE= (converti en str)

# Base64 → bytes
decoded = base64.b64decode(encoded)
print(decoded)              # b'Python is fun!'
print(decoded == binary)    # True

Pour les URLs, utilise urlsafe_b64

Le b64encode standard inclut + et /, donc l'intégrer directement dans des URLs ou des clés JSON nécessite un échappement. Pour les URLs et JSON, choisis base64.urlsafe_b64encode à la place — il échange +- et /_ pour te donner une variante URL-safe. Utilise base64.urlsafe_b64decode pour restaurer.

Encode une chaîne de bytes avec Base64, décode-la à nouveau, et vérifie que le résultat correspond à l'original.

① Importe le module base64.

② Prépare la chaîne de bytes b"Python is fun!".

③ N'affiche pas les bytes encodés Base64 comme bytes — convertis-les d'abord en chaîne ASCII et affiche sous la forme Chaîne Base64 : ◯◯.

④ Décode le Base64 vers le binaire d'origine et affiche s'il correspond à l'original sous la forme Égal à l'original : True / False.

Éditeur Python

Exécuter le code pour voir le résultat
QUIZ

Vérification des connaissances

Répondez à chaque question une par une.

Question 1Quel est le danger d'appeler pickle.loads sur des données pickle non fiables ?

Question 2Quel est le type de la valeur de retour de pickle.dumps(obj) ?

Question 3Quelle fonction est la meilleure quand tu veux mettre une chaîne base64 dans un paramètre de requête URL ?