22

ファイルが によって作成されたかどうかを確認する方法はありますpickleか? スローされpickle.loadた例外をキャッチすることはできましたが、特定の「ピクルスファイルではない」例外はありません。

4

2 に答える 2

13

ピクル ファイルにはヘッダーがないため、ピクル ファイルをアンピクルして、その際に例外が発生するかどうかを確認する以外に、それらを識別する標準的な方法はありません。

モジュール内のPickler()およびUnpickler()クラスをサブクラス化することにより、ある種のヘッダーを含む独自の拡張プロトコルを定義できます。pickleただし、これははるかに高速なモジュールでは実行できません。これは、サブクラス化できないcPickleファクトリ関数であるためです[1]

より柔軟なアプローチは、実装でこれらのモジュールのいずれかから対応するインスタンスPickler()を使用する独自の独立したクラスを定義することです。Unpickler()

アップデート

すべての pickle ファイルの最後のバイトはpickle.STOPオペコードである必要があるため、ヘッダーはありませんが、事実上、比較的簡単に確認できる非常に最小限のトレーラーがあります。

STOPpickle 化されたオブジェクトの表現でオペコードを過ぎたデータは無視されるため、正確な使用法に応じて、より精巧な (そして 1 バイトよりも長い) ものでそれを補うことができる場合があります[2]

[1]   Python 2 ドキュメントの脚注 [2] 。
[2]  のドキュメント。これは、現在前者に関して実装されている ためpickle.loads()、 にも適用されます。pickle.load()
于 2012-12-18T21:45:23.903 に答える
12

それを解凍して例外をキャッチする以外に確実な方法はありません。

于 2012-12-18T19:24:49.010 に答える