繁体   English   中英

在 Python 3.8 中加载使用 Python 2.7 创建的 pickle 文件时出错

[英]Error loading pickle file created with Python 2.7 in Python 3.8

我有一个包含浮点值的泡菜文件。 这个文件是用 Python 2.7 创建的。 在 Python 2.7 中,我曾经像这样加载它:

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

现在在 Python 3.8 中,这段代码给出了错误

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

当我尝试使用 'rb' 时出现此错误

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.

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM