[英]Decode pickle file in human-readable format in python
import pickle
data_pkl = open("data.pkl", "rb")
d_c = data_pkl.read()
data_pkl.close()
print(d_c)
轉儲數據時, pickle會生成一個字節字符串。 這就是你所擁有的。
例如:
import pickle
data = {'text': 'value', 'list': [1, 2, 3]}
s = pickle.dumps(data)
print(s)
產生字節字符串:
b'\x80\x03}q\x00(X\x04\x00\x00\x00textq\x01X\x05\x00\x00'
b'\x00valueq\x02X\x04\x00\x00\x00listq\x03]q\x04(K\x01K'
b'\x02K\x03eu.'
注意 :為了便於閱讀,我將長行分為三部分。
Python定義了幾種協議,分別命名為HIGHEST_PROTOCOL
和DEFAULT_PROTOCOL
。 因此,如果更改協議,則可能會有不同的結果。
要讀取此字節字符串,您需要使用pickle.load
(或pickle.loads
從字節字符串讀取)。
例如:
import pprint
obj = pickle.loads(s)
pprint.pprint(obj)
你得到:
{'list': [1, 2, 3], 'text': 'value'}
很酷,但是如果您的數據包含未知類型的實例,則將無法對其進行反序列化。
這是一個例子:
import pickle
import pprint
class UnknownClass:
def __init__(self, value):
self.value = value
data = {'text': 'value',
'list': [1, 2, 3],
'u': UnknownClass(25)}
s = pickle.dumps(data)
print(s)
del UnknownClass
obj = pickle.loads(s)
這里的del
語句用於模擬未知類型。
結果將是:
Traceback (most recent call last):
File "/path/to/stack.py", line 19, in <module>
obj = pickle.loads(s)
AttributeError: Can't get attribute 'UnknownClass' on <module '__main__' from '/path/to/stack.py'>
有關更多信息,請在Python文檔中指定協議。
我建議您查看Python文檔,尤其是pickle
模塊docs 。 您當前的代碼正在導入pickle
,但實際上並沒有使用pickle
,因為您只是使用read()
加載文件。 使用pickle.load()
或其他pickle
方法應該可以解決問題。
例如:
d_c = pickle.load(data_pkl)
編輯以添加來自文檔的強制性腌制警告:
警告:泡菜模塊無法防止錯誤或惡意構建的數據。 切勿挑剔從不可信或未經身份驗證的來源收到的數據。
(解開未知文件會使您容易在計算機上執行任意代碼,因此請小心操作!)
當 google 將我帶到這個問題時,我希望看到的答案是
import pickletools<\/code> ,然后使用
pickletools.dis(s)<\/code>來解釋 pickle 中可理解
s<\/code>子字符串之間的各種字符表示什么。
這只是勉強可讀,因為它讀起來更像機器匯編語言而不是 python,但它仍然可以幫助人類讀者窺視幕后並理解 gobbledygook。
當然,我們通常想要的不是讓人類<\/em>讀取序列化數據,而是讓計算機<\/em>讀取並利用好它。 如果這就是你想要的,
pickle.load<\/code>或
pickle.loads<\/code>就是要走的路。
或者,如果出於某種原因,您想以人類可讀和機器可讀的格式序列化數據,您可能需要其他序列化程序,例如 JSON,或者您可以設置 pickle 以使用原始 pickle 協議 0 進行編碼,這是人類可讀的(但效率較低)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.