Как я могу решить, "ascii 'кодек не может декодировать байт 0x9a в позиции 8: порядковый номер не в диапазоне (128)"?(Проблема с cPickle в питоне 3) - PullRequest
0 голосов
/ 25 апреля 2019

Я использую Python 3.x и хочу запустить следующий код:

import cPickle
x = cPickle.load(open('s01.dat', 'rb'))

Это работает очень хорошо в Python 2.x, но когда я пытаюсь в Python 3, я получаю эту ошибку:

ModuleNotFoundError: Нет модуля с именем 'cPickle'

Я решил это другим постом в StackOverflow и изменил свой код на:

import _pickle as cPickle
x = cPickle.load(open('s07.dat', 'rb'))

И я получаю эту ошибку:

UnicodeDecodeError: кодек «ascii» не может декодировать байт 0x9a в позиции 8: порядковый номер не в диапазоне (128)

Я пытаюсьрешить эту проблему, изменив кодировку следующим образом:

import _pickle as cPickle
x = cPickle.load(open('s07.dat', 'rb',encoding='iso-8859-1'))

или

import _pickle as cPickle
x = cPickle.load(open('s07.dat', 'rb',encoding='utf-8'))

, но все равно я получаю эту ошибку:

ValueError: двоичный режим непримите аргумент кодировки

Мой файл * .dat содержит два массива, и я ожидаю их импорта!Как я мог преодолеть эти проблемы?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Моя проблема решена с помощью ответа @Macattack, как показано ниже:

import pickle 
x = pickle.load(open('s07.dat', 'rb'),  encoding='iso-8859-1')
1 голос
/ 25 апреля 2019

Во-первых, если вы пытаетесь использовать pickle в python3, просто сделайте import pickle (он использует скомпилированный cPickle, когда он доступен) или from six.moves import cPickle, если вам нужна совместимость с python2.

Во-вторых, вам нужна опция кодирования, которая отправляется на pickle.load, а не на open. Попробуйте:

x = cPickle.load(open('s07.dat', 'rb'), encoding='utf-8')
...