ファイルが によって作成されたかどうかを確認する方法はありますpickle
か? スローされpickle.load
た例外をキャッチすることはできましたが、特定の「ピクルスファイルではない」例外はありません。
2 に答える
ピクル ファイルにはヘッダーがないため、ピクル ファイルをアンピクルして、その際に例外が発生するかどうかを確認する以外に、それらを識別する標準的な方法はありません。
モジュール内のPickler()
およびUnpickler()
クラスをサブクラス化することにより、ある種のヘッダーを含む独自の拡張プロトコルを定義できます。pickle
ただし、これははるかに高速なモジュールでは実行できません。これは、サブクラス化できないcPickle
ファクトリ関数であるためです[1]。
より柔軟なアプローチは、実装でこれらのモジュールのいずれかから対応するインスタンスPickler()
を使用する独自の独立したクラスを定義することです。Unpickler()
アップデート
すべての pickle ファイルの最後のバイトはpickle.STOP
オペコードである必要があるため、ヘッダーはありませんが、事実上、比較的簡単に確認できる非常に最小限のトレーラーがあります。
STOP
pickle 化されたオブジェクトの表現でオペコードを過ぎたデータは無視されるため、正確な使用法に応じて、より精巧な (そして 1 バイトよりも長い) ものでそれを補うことができる場合があります[2]。
-
[1] Python 2 ドキュメントの脚注 [2] 。
[2] のドキュメント。これは、現在前者に関して実装されている ため
pickle.loads()
、 にも適用されます。pickle.load()
それを解凍して例外をキャッチする以外に確実な方法はありません。