2012-12-18 3 views
15

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

+9

ビネガーとディルの痕跡を確認してください –

+0

'pickle.dump'を使ったときにファイルが作られたのか、' pickle.load'を使った時にファイルが存在するのか心配していますか?どちらの場合でも、実際の 'pickle'行ではなく出力または入力のためにファイルハンドルを開くときにエラーが発生します。 –

+0

私はファイルが存在するかどうかについては心配していませんが、存在するファイルが 'pickle'によって作成されているかどうかについては心配していません。 – Erik

答えて

8

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

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

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

更新

ヘッダが存在しない間、が効果的に比較的単純なことだろう非常に最小限のトレーラーがあるように、すべての漬物ファイルの最後のバイトは、pickle.STOPオペコードでなければなりませんチェック。

あなたの正確な使用状況に応じて、あなたは漬け物の表現でSTOPオペコード過去の任意のデータから、より精巧な何かを無視していることを補完して逃げることができるかもしれない[2]を。

[1]パイソン2ドキュメントの     Footnote [2]
[2]     pickle.loads()のドキュメントは、 pickle.load()にも適用されています。現在、後者に関して実装されています。
7

これをアンピクルして例外をキャッチしようとする以外の方法はありません。

関連する問題