Qu'est-ce que le format de fichier PKL ?
Un fichier .pkl contient un objet Python sérialisé à l'aide du module pickle de la bibliothèque standard Python. Le « pickling » convertit presque n'importe quelle structure de données Python - dictionnaires, listes, instances de classe, tableaux NumPy, modèles d'apprentissage automatique entraînés - en un flux d'octets qui peut être enregistré sur disque et restauré plus tard avec pickle.load().
Le format utilise une machine virtuelle Pickle (PVM) basée sur une pile : un flux d'opcodes d'un seul octet qui, lorsqu'ils sont exécutés, reconstruisent l'objet original. Les versions de protocole vont du Protocole 0 (opcodes textuels, Python 1.2) au Protocole 5 (Python 3.8+, PEP 574, prenant en charge les tampons hors bande pour les grands tableaux NumPy). Le Protocole 4 (octets magiques 80 04 95) est le protocole par défaut dans Python 3.8-3.11. Il n'y a pas de schéma fixe ; la structure du flux d'octets est entièrement déterminée par l'objet sérialisé.
L'utilisation moderne dominante est la sauvegarde de modèles de ML entraînés provenant de scikit-learn, PyTorch (torch.save encapsule pickle en interne) et XGBoost, ainsi que la mise en cache de résultats de calcul coûteux. La bibliothèque joblib (qui utilise également pickle) est préférée pour les grands tableaux NumPy en raison de sa prise en charge du mappage mémoire.
Avertissement de sécurité : le chargement d'un fichier .pkl provenant d'une source non fiable peut exécuter du code Python arbitraire. Les alternatives plus sûres incluent .json pour les données simples, HDF5 ou Parquet pour les données tabulaires, et ONNX ou safetensors pour les modèles de ML. Les extensions .pkl et .pickle sont totalement interchangeables.
Sécurité et sûreté
RISQUE : HIGHPython Pickle peut exécuter du code arbitraire pendant le chargement (via __reduce__ / opcode REDUCE). Un fichier .pkl malveillant est un vecteur d'attaque par exécution de code - traitez-le comme un exécutable. Ne chargez que des fichiers .pkl provenant de sources en lesquelles vous avez une entière confiance. Pour le partage de modèles de ML, préférez les formats safetensors (HuggingFace) ou ONNX qui ne peuvent pas exécuter de code au chargement. La documentation de pickle prévient explicitement : « Le module pickle n'est pas sécurisé. »
Détails du format
en bref- Microsoft Exchange Migration Wizard Packing List - L'ancien outil de migration Microsoft Exchange utilisait .pkl pour les listes de colisage ; totalement sans rapport avec Python pickle.
Programmes qui ouvrent les fichiers PKL
Détails techniques
spécifications approfondies| Encodage | Flux d'opcodes binaires pour la machine virtuelle Pickle (PVM) |
| Octets magiques Protocole 4 | 80 04 95 à l'offset 0 (Python 3.4+ ; par défaut dans Python 3.8-3.11) |
| Octets magiques Protocole 5 | 80 05 à l'offset 0 (Python 3.8+, PEP 574, support des tampons hors bande pour NumPy) |
| Octets magiques Protocole 2 | 80 02 à l'offset 0 (Python 2.3+, support des classes de nouveau style, PEP 307) |
| Plage de protocoles | Protocole 0 (opcodes texte, 1995) au Protocole 5 (Python 3.8+, 2019) |
| Structure des données | Flux d'opcodes plat avec pile d'opérandes et table mémo ; l'opcode STOP (0x2E) marque la fin du flux |
| Schéma | Aucun schéma fixe ; la structure est entièrement déterminée par l'objet Python sérialisé |
| Type MIME | application/octet-stream (aucun type MIME enregistré) |
| Taille de fichier typique | 1 Ko - plusieurs Go (des petits dictionnaires aux grands tenseurs de poids de modèles ML) |
| Risque de sécurité | Exécution de code Python arbitraire possible lors de pickle.load() depuis des sources non fiables |
| Portabilité multi-langage | Python uniquement ; aucun autre langage ne peut lire ou écrire nativement ce format |
| Usage moderne principal | Sauvegarde de modèles scikit-learn, poids PyTorch (torch.save), modèles XGBoost, calculs mis en cache |
| Extension interchangeable | .pickle est identique au format et totalement interchangeable avec .pkl |
| Bibliothèque associée | joblib encapsule pickle avec des optimisations de mappage mémoire adaptées aux grands tableaux NumPy |
| Publié | 1995 (Python 1.2, original pickle module) |
| Dernière version | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| Spécification | docs.python.org |