Python 3.x 泡菜罐头';无法加载Pascal VOC pickle数据集

Python 3.x 泡菜罐头';无法加载Pascal VOC pickle数据集,python-3.x,numpy,pickle,semantic-segmentation,Python 3.x,Numpy,Pickle,Semantic Segmentation,我正在尝试从斯坦福网站加载Pascal VOC数据集。还试图实现来自的代码。但是当我试图加载pickle文件时,我得到了UnicodeDecodeError。到目前为止,我尝试了以下代码: import numpy as np try: import cPickle as pickle except ImportError: import pickle from pystruct import learners import pystruct.models as crfs fr

我正在尝试从斯坦福网站加载Pascal VOC数据集。还试图实现来自的代码。但是当我试图加载pickle文件时,我得到了UnicodeDecodeError。到目前为止,我尝试了以下代码:

import numpy as np
try:
    import cPickle as pickle
except ImportError:
    import pickle

from pystruct import learners
import pystruct.models as crfs
from pystruct.utils import SaveLogger

data_train = pickle.load(open("trainingData/data_train.pickle"))
C = 0.01
我犯了一个错误:

Traceback (most recent call last):
  File "/Users/mypath/PycharmProjects/semantic_segmentation_ex/ex1.py", line 11, in <module>
    data_train = pickle.load(open("trainingData/data_train.pickle"))
  File "/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)
回溯(最近一次呼叫最后一次):
文件“/Users/mypath/PycharmProjects/semantic_segmentation_ex/ex1.py”,第11行,在
数据\u train=酸洗载荷(打开(“列车数据/数据\u train.pickle”))
文件“/usr/local/ceral/python3/3.6.2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/encodings/ascii.py”,第26行,解码
返回编解码器。ascii_解码(输入,自身错误)[0]
UnicodeDecodeError:“ascii”编解码器无法解码位置0:序号不在范围(128)中的字节0x80

我找不到任何相同的问题和解决方案。我怎样才能让它工作呢?

我的一个朋友告诉了我原因。序列化对象是一个python2对象,所以如果使用python2加载,它将直接打开,不会出现任何问题

但如果您想使用Python3加载,则需要将编码参数添加到pickle not到open函数中。以下是示例代码:

import numpy as np

try:
    import cPickle as pickle
except ImportError:
    import pickle


with open('data_train.pickle', 'rb') as f:
    # If you use Python 3 needs a parameter as encoding='bytes'
    # Otherwise, you shouldn't add encoding parameters in Python 2
    data_train = pickle.load(f, encoding='bytes')


print("Finished loading data!")
print(data_train.keys())

特别感谢@ahmet sezgin duran

通常,Pickle文件应该以二进制模式打开:
open(“trainingData/data\u train.Pickle”,“rb”)
。尝试过了,但仍然出现相同的错误。您可能需要添加一个
编码='latin-1'
作为参数。我应该在哪里添加此编码参数?
Pickle.load(open(“trainingData/data_train.pickle”,“wb”,编码为“拉丁语-1”)