繁体   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