2017-01-29 1 views
2

バイト文字列オブジェクトがpickledオブジェクトであるかどうかを識別する方法。バイト文字列がピクルされたオブジェクトであるかどうかを識別する方法?

たとえば、次の辞書では、bがピクルされたオブジェクトであり、他のオブジェクトはそうでないことをどのように識別できますか?

example = {'a':1, 'b':b'\x80\x03K\x02.', 'c':b'3'} 
+2

これをアンピクルしようとすると、失敗した場合はアンピクルされたデータとして表示されます。 Pickleにはヘッダーがありますが、バイナリ文字列には同じヘッダーがあることは偶然かもしれません。 –

+3

[* "許可よりも許してほしいのは簡単です" *(https://docs.python.org/3/glossary.html#term-eafp) – jonrsharpe

答えて

3

例えば最初のバイトは、プロトコル番号が続き、常に\x80であることがそうストリームは漬物ストリームであること(あるかどうかを指示する方法はありますが、ここでは\x03、最後のバイトでもあります常にb'.')、確かにそれを知るのは難しいです(最初のバイトはランダムな文字列の\x80です)。だから、より良いだけでそれをunpickle化し、それがうまくいくかどうかを確認してみてください:

import pickle 

def is_pickle_stream(stream): 
    try: 
     pickle.loads(stream) 
     return True 
    except UnpicklingError: 
     return False 

上記の方法は、ストリームは、漬物ストリーム、Falseであればそうでない場合Trueを返し、loadsをスローした場合に例外がスローされます例外(メモリ不足など)。

関連する問題