使用 gzip 和 pickle 时出现 UnicodeDecodeError
UnicodeDecodeError while using gzip and pickle
我在Python3.4
中使用mnist数据进行深度学习的练习代码
原代码为
import _pickle as cPickle
def load_data():
f = gzip.open('../data/mnist.pkl.gz', 'rb')
training_data, validation_data, test_data = cPickle.load(f)
f.close()
return (training_data, validation_data, test_data)
def load_data_wrapper():
tr_d, va_d, te_d = load_data()
....
但是会导致UnicodeDecodeError,根据网上的建议,我把cPickle.load(f)
改成了pickle.load(f, encoding='latin1')
当我在 shell
中 运行 时出现同样的错误
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper() \
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "C:\E\Deep Learning Tutorial\neural-networks-and-deep-learning-master\src\mnist_loader.py", line 68, in load_data_wrapper
tr_d, va_d, te_d = load_data()
File "C:\E\Deep Learning Tutorial\neural-networks-and-deep-learning-master\src\mnist_loader.py", line 43, in load_data
错误行追溯到:
f = gzip.open('../data/mnist.pkl.gz', 'rb')
和之前一样的错误,只是出现在不同的行
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
如何解决这个问题?
首先,我能够使用从我下载的 https://github.com/mnielsen/neural-networks-and-deep-learning/archive/master.zip 存档中提取的 mnist.pkl.gz
数据文件重现该问题。 pickle.load(f)
调用引发以下异常:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
然而,当我按照我在您问题下的评论中建议的那样将 encoding='bytes'
参数添加到 pickle.load()
调用时,错误消失了。
另一个更改是将 import _pickle as cPickle
替换为 import pickle
,但我认为这并不重要(请参阅 What difference between pickle and _pickle in python 3?)。
其他 可能 重要的区别是,我在 Windows.[=22 上使用 Python 3.6.3 =]
import gzip
import pickle
def load_data():
f = gzip.open('mnist.pkl.gz', 'rb')
training_data, validation_data, test_data = \
pickle.load(f, encoding='bytes') # Note encoding argument value.
f.close()
return (training_data, validation_data, test_data)
def load_data_wrapper():
tr_d, va_d, te_d = load_data()
print('gzipped pickled data loaded successfully')
load_data_wrapper()
题外话:
load_data()
函数可以写得更简洁一点:
def load_data():
with gzip.open('mnist.pkl.gz', 'rb') as f:
training_data, validation_data, test_data = \
pickle.load(f, encoding='bytes')
return training_data, validation_data, test_data
我在Python3.4
中使用mnist数据进行深度学习的练习代码原代码为
import _pickle as cPickle
def load_data():
f = gzip.open('../data/mnist.pkl.gz', 'rb')
training_data, validation_data, test_data = cPickle.load(f)
f.close()
return (training_data, validation_data, test_data)
def load_data_wrapper():
tr_d, va_d, te_d = load_data()
....
但是会导致UnicodeDecodeError,根据网上的建议,我把cPickle.load(f)
改成了pickle.load(f, encoding='latin1')
当我在 shell
中 运行 时出现同样的错误>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper() \
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "C:\E\Deep Learning Tutorial\neural-networks-and-deep-learning-master\src\mnist_loader.py", line 68, in load_data_wrapper
tr_d, va_d, te_d = load_data()
File "C:\E\Deep Learning Tutorial\neural-networks-and-deep-learning-master\src\mnist_loader.py", line 43, in load_data
错误行追溯到:
f = gzip.open('../data/mnist.pkl.gz', 'rb')
和之前一样的错误,只是出现在不同的行
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
如何解决这个问题?
首先,我能够使用从我下载的 https://github.com/mnielsen/neural-networks-and-deep-learning/archive/master.zip 存档中提取的 mnist.pkl.gz
数据文件重现该问题。 pickle.load(f)
调用引发以下异常:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
然而,当我按照我在您问题下的评论中建议的那样将 encoding='bytes'
参数添加到 pickle.load()
调用时,错误消失了。
另一个更改是将 import _pickle as cPickle
替换为 import pickle
,但我认为这并不重要(请参阅 What difference between pickle and _pickle in python 3?)。
其他 可能 重要的区别是,我在 Windows.[=22 上使用 Python 3.6.3 =]
import gzip
import pickle
def load_data():
f = gzip.open('mnist.pkl.gz', 'rb')
training_data, validation_data, test_data = \
pickle.load(f, encoding='bytes') # Note encoding argument value.
f.close()
return (training_data, validation_data, test_data)
def load_data_wrapper():
tr_d, va_d, te_d = load_data()
print('gzipped pickled data loaded successfully')
load_data_wrapper()
题外话:
load_data()
函数可以写得更简洁一点:
def load_data():
with gzip.open('mnist.pkl.gz', 'rb') as f:
training_data, validation_data, test_data = \
pickle.load(f, encoding='bytes')
return training_data, validation_data, test_data