【问题标题】:Decode pickle file in human-readable format in python在python中以人类可读格式解码pickle文件
【发布时间】:2019-08-07 18:46:54
【问题描述】:
import pickle

data_pkl = open("data.pkl", "rb")
d_c = data_pkl.read()
data_pkl.close()
print(d_c)

我是处理数据结构的新手。当我尝试读取泡菜数据时,结果如下所示:

b'\x80\x03}q\x00(X\x05\x00\x00\x00Phoneq\x01}q\x02(cnumpy.core.multiarray\nscalar\nq\x03cnumpy\ndtype\nq\x04X\x02\ x00\x00\x00i8q\x05K\x00K\x01\x87q\x06Rq\x07(K\x03X\x01\x00\x00\x00

.......长线

如何在 python 中将其转换为人类可读的格式?

【问题讨论】:

  • 你的泡菜返回一个字节文字,这意味着它有 ascii 字符 \x、\x00 等,所以你需要对其进行解码尝试 print(d_c.decode('utf-8'))
  • 不使用pickle读取文件有什么原因吗?
  • @Mntfr Pickle 文件格式并不是那么简单。打电话给decode()是不够的。
  • @Mntfr 这不是文本格式。而且它不是用 UTF-8 编码的。所以你不能像那样解码它。您需要使用pickle.loads

标签: python python-3.x


【解决方案1】:

当数据被转储时,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.'

注意:为了便于阅读,我将长线分成 3 部分。

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 文档中指定。

【讨论】:

    【解决方案2】:

    我建议查看 Python 文档,尤其是 pickle module docs。您当前的代码正在导入pickle,但实际上并未使用pickle,因为您只是使用read() 加载文件。使用pickle.load() 或其他pickle 方法应该可以解决问题。

    例如:

    d_c = pickle.load(data_pkl)
    

    编辑以添加来自文档的强制泡菜警告:

    警告:pickle 模块不能防止错误或恶意 构造的数据。永远不要解开从不受信任或 未经验证的来源。

    (解压未知文件会使您在计算机上执行任意代码,因此请小心解压的内容!)

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 2017-01-28
      • 1970-01-01
      相关资源
      最近更新 更多