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