Вам нужно будет рассказать, pickle.load()
как преобразовать данные строки байтов Python в строки Python 3, или вы можете pickle
оставить их в виде байтов.
По умолчанию выполняется попытка декодирования всех строковых данных как ASCII, и это декодирование не удается. См. pickle.load()
Документацию :
Необязательными аргументами ключевого слова являются fix_imports , кодировка и ошибки , которые используются для управления поддержкой совместимости для потока pickle, созданного Python 2. Если fix_imports истинно, pickle попытается сопоставить старые имена Python 2 с новыми именами, используемыми в Python 3. кодирование и ошибки сообщают pickle, как декодировать экземпляры 8-битных строк, обработанные Python 2; по умолчанию они имеют значения «ASCII» и «строгий» соответственно. Кодирование может быть «байт» , чтобы прочитать эти 8-битовую строку экземпляров , как байты объектов.
Установка кодировки latin1
позволяет напрямую импортировать данные:
with open(mshelffile, 'rb') as f:
d = pickle.load(f, encoding='latin1')
но вам нужно убедиться, что ни одна из ваших строк не декодируется с использованием неправильного кодека; Latin-1 работает для любого ввода, поскольку он напрямую сопоставляет байтовые значения 0–255 с первыми 256 кодовыми точками Unicode.
Альтернативой может быть загрузка данных и последующее encoding='bytes'
декодирование всех bytes
ключей и значений.
Обратите внимание, что до версий Python до 3.6.8, 3.7.2 и 3.8.0 распаковка данных datetime
объекта Python 2 не выполняется, если вы не используете encoding='bytes'
.
json
модуль? Возможно, вы могли бы написать сценарий 2.4, который распаковывает объект и сохраняет его как объект json, а затем написать сценарий 3.4, который считывает объект json и сохраняет его как совместимый с 3.4 объект pickle. Это будет одноразовая операция, которую вы выполняете для всех файлов рассола.