【发布时间】:2020-10-27 06:42:52
【问题描述】:
为了反序列化字节对象,我们使用pickle.loads()
import pickle
import numpy as np
pickle.loads(np.float64(0.34103))
并且预期的结果如下(因为 np.float64(0.34103) 不是字节对象,预计会出现适当的错误)
---------------------------------------------------------------------------
UnpicklingError Traceback (most recent call last)
<ipython-input-19-5c07606a60f1> in <module>
----> 1 pickle.loads(np.float64(0.34103))
UnpicklingError: invalid load key, '\xc1'.
这里我们有一些问题,像 0.34104 这样的数字(很少见)打印出以下结果而没有错误。
pickle.loads(np.float64(0.34104))
True
仅当转换后的字节以 b'\x88 开头时才会发生这种情况(例如 0.04263、0.08526、0.11651 ...)
np.float64(0.34104).tobytes()
b'\x88.\xa8o\x99\xd3\xd5?'
谁能回答这个问题是否是Python错误?
任何答案都将受到高度赞赏。
【问题讨论】:
-
将
tobytes与np.frombuffer配对,并将pickle.dumps与pickle.loads配对。您尝试的配对没有意义。 -
我在您的代码示例中没有看到
tobytes。 -
我的意思是“np.float64(0.34104).tobytes()”给了我们以 b'x88 开头的二进制表达式。此数字打印 True 而不是错误。谁能解释一下这种现象?
-
你为什么要尝试
pickle.loads(x),其中x不是泡菜字节字符串?该协议并未设计用于接收此类随机数据。