在Python3.8中加载使用Python2.7创建的pickle文件时出错

2024-04-28 20:10:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含浮点值的pickle文件。此文件是使用Python 2.7创建的。在Python2.7中,我曾经像这样加载它:

matrix_file = pickle.load(open('matrix.pickle', 'r'))

现在在Python3.8中,这段代码给出了一个错误

TypeError: a bytes-like object is required, not 'str'

当我用“rb”trid时,我得到了这个错误

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 8: ordinal not in range(128)

所以我尝试了另一种方法

matrix_file = pickle.load(open('matrix.pickle', 'r', encoding='utf-8'))

现在我得到一个不同的错误

TypeError: a bytes-like object is required, not 'str'

更新:当我尝试使用joblib加载时,出现此错误

ValueError: You may be trying to read with python 3 a joblib pickle generated with python 2. This feature is not supported by joblib.

Tags: 文件bytesobjectis错误requirednotload
1条回答
网友
1楼 · 发布于 2024-04-28 20:10:49

文件必须以二进制模式打开,并且您需要为pickle.load调用提供一个encoding。通常,encoding应该是"latin-1"(对于带有numpy数组的pickle,datetimedatetime对象,或者当字符串逻辑上是拉丁-1时),或者"bytes"(将python2str解码为bytes对象)。所以代码应该是这样的:

with open('matrix.pickle', 'rb') as f:
    matrix_file = pickle.load(f, encoding='latin-1')

这假设它最初包含numpy数组;如果不是,则"bytes"可能是更合适的编码。我还使用了一个with语句,只是为了保持良好的形式(并确保在非CPython解释器上关闭确定性文件)

相关问题 更多 >