PKL ファイル形式とは?
.pkl ファイルには、Python 標準ライブラリの pickle モジュールを使用してシリアル化された Python オブジェクトが含まれています。Pickling(ピクリング)は、辞書、リスト、クラス・インスタンス、NumPy 配列、トレーニング済みの機械学習モデルなど、ほぼすべての Python データ構造を、ディスクに保存して後で pickle.load() で復元できるバイト・ストリームに変換します。
この形式は、スタックベースの Pickle Virtual Machine (PVM) を使用します。これは、実行されると元のオブジェクトを再構築するシングルバイト・オペコードのストリームです。プロトコル・バージョンは、プロトコル 0(テキストベースのオペコード、Python 1.2)からプロトコル 5(Python 3.8+、PEP 574、大きな NumPy 配列用の帯域外バッファをサポート)まであります。プロトコル 4(マジックバイト 80 04 95)は、Python 3.8-3.11 におけるデフォルトです。固定されたスキーマはなく、バイト・ストリームの構造はシリアル化されるオブジェクトによって完全に決定されます。
現代における主な用途は、scikit-learn、PyTorch(torch.save は内部で pickle をラップしています)、XGBoost からのトレーニング済み ML モデルの保存、およびコストの高い計算結果のキャッシュです。大きな NumPy 配列の場合は、メモリマッピングをサポートしている joblib ライブラリ(これも内部で pickle を使用)が好まれます。
セキュリティ警告: 信頼できないソースから .pkl ファイルをロードすると、任意の Python コードが実行される可能性があります。より安全な代替手段として、単純なデータには .json、表形式のデータには HDF5 や Parquet、ML モデルには ONNX や safetensors があります。.pkl と .pickle 拡張子は完全に互換性があります。
セキュリティと安全性
リスク: HIGHPython Pickle は、ロード中に(__reduce__ / REDUCE オペコードを介して)任意のコードを実行できます。悪意のある .pkl ファイルはコード実行の攻撃ベクトルとなるため、実行ファイルと同様に扱ってください。完全に信頼できるソースからの .pkl ファイルのみをロードしてください。ML モデルの共有には、ロード時にコードを実行できない safetensors (HuggingFace) や ONNX 形式を推奨します。pickle のドキュメントには «The pickle module is not secure.»(pickle モジュールは安全ではありません)と明記されています。
形式の詳細
概要- Microsoft Exchange Migration Wizard Packing List - レガシーな Microsoft Exchange 移行ツールがパッキングリストに .pkl を使用していましたが、Python の pickle とは全く無関係です。
PKL ファイルを開くプログラム
技術的詳細
詳細仕様| エンコーディング | Pickle Virtual Machine (PVM) 用のバイナリ・オペコード・ストリーム |
| プロトコル 4 マジックバイト | オフセット 0 に 80 04 95 (Python 3.4+; Python 3.8-3.11 のデフォルト) |
| プロトコル 5 マジックバイト | オフセット 0 に 80 05 (Python 3.8+, PEP 574, NumPy 用の帯域外バッファサポート) |
| プロトコル 2 マジックバイト | オフセット 0 に 80 02 (Python 2.3+, 新スタイルクラスのサポート, PEP 307) |
| プロトコル範囲 | プロトコル 0 (テキスト・オペコード, 1995年) から プロトコル 5 (Python 3.8+, 2019年) |
| データ構造 | オペランド・スタックとメモ・テーブルを備えたフラットなオペコード・ストリーム。STOP オペコード (0x2E) がストリームの終端を示す |
| スキーマ | 固定スキーマなし。構造はシリアル化される Python オブジェクトによって完全に決定される |
| MIME タイプ | application/octet-stream (登録された MIME タイプなし) |
| 一般的なファイルサイズ | 1 KB - 数 GB (小さな辞書から巨大な ML モデルの重みテンソルまで) |
| セキュリティリスク | 信頼できないソースからの pickle.load() により、任意の Python コードが実行される可能性がある |
| 言語間の移植性 | Python 専用。他の言語でこの形式をネイティブに読み書きすることはできない |
| 現代の主な用途 | scikit-learn モデル、PyTorch の重み (torch.save)、XGBoost モデル、計算結果のキャッシュの保存 |
| 互換性のある拡張子 | .pickle は形式が同一であり、.pkl と完全に互換性がある |
| 関連ライブラリ | joblib は、大きな NumPy 配列に適したメモリマッピングの最適化で pickle をラップしている |
| リリース日 | 1995 (Python 1.2, original pickle module) |
| 最新バージョン | Protocol 5 (Python 3.8+, PEP 574, 2019) |
| 仕様書 | docs.python.org |
コミュニティ Q&A
ユーザーからの質問よくある質問
.pkl ファイルを開くにはどうすればよいですか?
import pickle; obj = pickle.load(open('file.pkl', 'rb'))。信頼できる pkl ファイルのみをロードしてください。ロード時にコードが実行される可能性があります。.pkl ファイルを開いても安全ですか?
どのプログラムが私の .pkl ファイルを作成したのでしょうか?
Python なしで .pkl ファイルを開くことはできますか?
.pkl を JSON や CSV に変換するにはどうすればよいですか?
json.dump(obj, open('out.json','w'))、表形式のデータなら pd.DataFrame(obj).to_csv() を使用します。