2017-01-29 68 views
2

如何識別字節串對象是否是一個pickle對象。如何識別一個字節字符串是否是一個pickle對象?

例如,在下面的字典中,我如何識別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 

上述方法將返回True如果流是泡菜流,False如果不是,並拋出一個異常,如果loads拋出異常(內存不足等)。

相關問題