Как читать сериализованные данные с помощью python2 cPikle с python3 pickle?

Я пытаюсь работать с CIFAR-10 dataset, который содержит специальная версия для python.

Это набор двоичных файлов, каждый из которых представляет собой словарь из 10k numpy-матриц. Файлы, очевидно, были созданы python2 cPickle.

Я попытался загрузить его из python2 следующим образом:

import cPickle
with open("data/data_batch_1", "rb") as f:
 data = cPickle.load(f)

Это работает отлично. Однако, если я попытаюсь загрузить данные из python3 (вместо cPickle, но pickle), это не сработает:

import pickle
with open("data/data_batch_1", "rb") as f:
 data = pickle.load(f)

Если сбой происходит со следующей ошибкой:

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

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

Я попробовал загрузить его cPickle, сбросив его на json и вернув его обратно pickle, но матрицы numpy, очевидно, не могут быть записаны как json файл.

1 ответ

Вам нужно будет рассказать, какой кодек использовать для этих байтов, или сказать, что вместо этого он загружает данные как bytes. Из pickle.load() документация:

Кодирование и ошибки сообщают о том, как декодировать 8-битовые строки, маринованные Python 2; они по умолчанию равны "ASCII и", соответственно. Кодировка может быть "байтами" для чтения этих 8-битовых экземпляров строк в виде объектов байтов.

Чтобы загрузить строки в качестве bytes объектов, которые будут:

import pickle
with open("data/data_batch_1", "rb") as f:
 data = pickle.load(f, encoding='bytes')

licensed under cc by-sa 3.0 with attribution.