【发布时间】:2019-04-22 09:28:34
【问题描述】:
我正在尝试将 Python 2 代码转换为 Python 3。我在 Python 2.7 中使用了 pickle.loads 函数,根据其文档,该函数执行以下操作 (https://docs.python.org/2.7/library/pickle.html):
pickle.loads(string)
Read a pickled object hierarchy from a string. Characters in the
string past the pickled object’s representation are ignored.
但是它在 Python 3 中的行为发生了变化 (https://docs.python.org/3/library/pickle.html):
pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict")
Read a pickled object hierarchy from a bytes object and return the
reconstituted object hierarchy specified therein.
在数据库中,我有一个字符串 x,它是在 Python 2 中执行的 pickle.dumps(obj) 的输出。我想在 Python 3 中检索 obj。当我执行 pickle.loads(x) 时,我收到以下错误:
a bytes-like object is required, not 'str'
将pickle.loads(x) 改为pickle.loads(bytes(x, 'utf-8')) 会出现以下错误:
invalid load key, '\x5c'.
如何在 Python 3 中从x 获取obj?
【问题讨论】:
-
如果您尝试将 Python 2 创建的 pickle 读入 Python 3,则需要设置正确的协议:docs.python.org/3/library/pickle.html#data-stream-format
-
This article 概述了执行此操作的整个过程,包括陷阱。
-
@jonrsharpe 根据其文档:自动检测泡菜的协议版本,因此不需要协议参数。调用python.loads时还需要显式设置协议吗?
-
@alec_a 这篇文章主要讨论的是
pickle.load,而不是pickle.loads。我无法通过尝试对pickle.loads进行类似修复来解决我的问题。
标签: python python-3.x python-2.7 pickle