2016-12-22 2 views
2

Новичок здесь, хотите прочитать данные с окончанием файла p.Рассеяние, чтение в данных, неподдерживаемый протокол рассола: 3 python 2.7

Мой код выглядит следующим образом:

import pickle 

training_file = "/home/sk/CarND-Traffic-Sign-Classifier-Project/train.p" 
testing_file = "/home/sk/CarND-Traffic-Sign-Classifier-Project/test.p" 
with open(training_file, mode='rb') as f: 
    train = pickle.load(f) 
with open(testing_file, mode='rb') as f: 
    test = pickle.load(f) 

Я получаю следующее сообщение об ошибке:

ValueError: неподдерживаемый протокол маринад: 3

Может кто-то момент, как я могу это исправить, либо изменения протокол или чтение данных другими способами?

+0

Это все ваш код? – iFlo

+0

Что не хватает? – hmmmbob

+0

Вы получаете эту ошибку, импортируя рассол? – iFlo

ответ

3

Имел ту же проблему, когда я создал файл pickle с помощью python3, а затем попытался загрузить его в python2. Попробуйте запустить программу с помощью python3 или попробуйте создать файл pickle с помощью python2.

+0

Нет ли другого пути? – hmmmbob

+0

Предлагается хороший способ. Более подробную информацию можно найти здесь [http://stackoverflow.com/questions/28218466/unpickling-a-python-2-object-with-python-3] – Degraw

2

Pickle использует разные протоколы для преобразования ваших данных в двоичный поток.

В python 2 есть 3 разных протокола (0, 1, 2) и по умолчанию 0. В python 3 есть 5 различных протоколов (0, 1, 2, 3, 4), а по умолчанию 3 . Вы должны указать в python 3 протокол ниже 3, чтобы иметь возможность загружать данные в python 2. Вы можете указать параметр протокола при вызове pickle.dump.

Кажется, что эти файлы были созданы с протоколом> = 3 (возможно, 3). Таким образом, единственный вариант, который вы получаете, - загрузить его в python 3, а затем сбросить его с помощью более низкого протокола.

+1

Да .. установлен python 3.5 сейчас .. и, конечно, тензорный поток отсутствует, и когда я пытаюсь установить его. он говорит, что уже удовлетворен в 2.7 :(:(Кажется, мне нужно снова установить ubuntu :( – hmmmbob

+0

Переустановка ubuntu на самом деле не нужна – iFlo

+0

Вы должны уже или можете получить pip-3.5. Когда вы запустите команду pip, она займет тот, кто ссылается на (кажется, его 2.7 в вашем случае), но используя /usr/local/bin/pip3.5, а затем ваша команда будет работать. – iFlo

1

Очевидно, что протокол рассола 3 использовался в любом коде python 3, маринованном объектом. Вы не можете unpickle с протоколом 3 в Python 2. Однако вы могли бы написать короткий питон 3 программу, которая загружает его, а затем сбрасывает его с протоколом = 2. Тогда вы можете загрузить их в Python 2.

https://docs.python.org/2/library/pickle.html#usage

Смежные вопросы