簡體   English   中英

"在python中以人類可讀格式解碼pickle文件"

[英]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_PROTOCOLDEFAULT_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM