ValueError: неподдерживаемый протокол рассола: 3, рассол python2 не может загрузить файл, сброшенный рассолом python 3?

101

Я использую pickle для дампа файла на python 3 и использую pickle для загрузки файла на python 2, появляется ValueError.

Итак, python 2 pickle не может загрузить файл, сброшенный python 3 pickle?

Если я этого хочу? Как сделать?

Aleeee
источник
5
Если вы застряли с уже написанными маринованными файлами, посмотрите: stackoverflow.com/questions/34571063/…
rysqui 03

Ответы:

158

Вы должны записать обработанные данные с меньшим номером протокола в Python 3. Python 3 представил новый протокол с номером 3(и использует его по умолчанию), поэтому вернитесь к значению, 2которое может быть прочитано Python 2.

Проверьте protocolпараметр в pickle.dump. Ваш результирующий код будет выглядеть так.

pickle.dump(your_object, your_file, protocol=2)

protocolПараметр отсутствует, pickle.loadпотому pickleчто протокол можно определить по файлу.

Матиас
источник
55

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

Вы должны указать в python 3 протокол ниже, чем 3для того, чтобы иметь возможность загружать данные в python 2. Вы можете указать protocolпараметр при вызове pickle.dump.

enrico.bacis
источник
11
Просто для справки в будущем, очевидно, есть протокол, 5который также был введен в Python 3.8, который несовместим с более ранними версиями.
Фарзад Абдольхоссейни,
re: протокол 5 python.org/dev/peps/pep-0574
Калеб Сайринг