Вам доведеться розповісти, pickle.load()як перетворити дані про тестування Python в рядки Python 3, або ви можете pickleзалишити їх у байтах.
За замовчуванням - спробувати розшифрувати всі рядкові дані як ASCII, і це декодування не вдалося. Дивіться pickle.load()документацію :
Додатковими аргументами ключових слів є fix_imports , кодування та помилки , які використовуються для управління підтримкою сумісності потоку маринованих сигналів, згенерованого Python 2. Якщо true_imports вірно, pickle спробує зіставити старі імена Python 2 з новими іменами, які використовуються в Python 3. The кодування та помилки підказують маринуванню, як розшифрувати 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.0datetime , вилучення даних об’єкта Python 2 порушено, якщо ви не використовуєте encoding='bytes'.
jsonмодуль Python 2.4 ? Можливо, ви могли б написати сценарій 2.4, який видаляє об'єкт і зберігає його як json-об’єкт, а потім написати 3.4-скрипт, який читає json-об’єкт і зберігає його як 3.4-сумісний об’єкт маринування. Це була б разова операція, яку ви виконуєте на всіх ваших файлах підбору.