我该如何解决 "ascii' codec can't decode byte 0x9a in position 8: ordinal not in range(128)"? (python 3 中的 cPickle 问题)

how could I solve "ascii' codec can't decode byte 0x9a in position 8: ordinal not in range(128)"? ( A problem with cPickle in python 3)

我正在使用 python 3.x,我想 运行 下面的代码:

import cPickle
x = cPickle.load(open('s01.dat', 'rb'))

它在 python 2.x 中运行良好,但是当我在 python 3 中尝试时,出现此错误:

ModuleNotFoundError: No module named 'cPickle'

我在 Whosebug 中由其他 post 解决了它,并将我的代码更改为:

import _pickle as cPickle
x = cPickle.load(open('s07.dat', 'rb'))

我得到这个错误:

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

我尝试通过更改编码来解决它:

import _pickle as cPickle
x = cPickle.load(open('s07.dat', 'rb',encoding='iso-8859-1'))

import _pickle as cPickle
x = cPickle.load(open('s07.dat', 'rb',encoding='utf-8'))

但我仍然收到此错误:

ValueError: binary mode doesn't take an encoding argument

我的 *.dat 文件包含两个数组,我希望导入它们! 我该如何克服这些问题?

首先,如果您尝试在 python3 中使用 pickle,只需执行 import pickle(它在可用时使用已编译的 cPickle)或 from six.moves import cPickle 如果您需要与 python2.

兼容

其次,您需要的编码选项是发送到 pickle.load 而不是 open 的编码选项。尝试:

x = cPickle.load(open('s07.dat', 'rb'), encoding='utf-8')

我的问题已通过使用@Macattack 的回答解决,如下所示:

import pickle 
x = pickle.load(open('s07.dat', 'rb'),  encoding='iso-8859-1')