как я мог бы решить проблему «кодек ascii не может декодировать байт 0x9a в позиции 8: порядковый номер не в диапазоне (128)»? (Проблема с cPickle в python 3)

#python #python-3.x #numpy #load #pickle

#python #python-3.x #numpy #загрузить #рассол

Вопрос:

Я использую 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'))
  

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

Ошибка значения: двоичный режим не принимает аргумент encoding

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

Комментарии:

1. @101arrowz да, я пробовал это, и я получил ошибку> TypeError: требуется байтоподобный объект, а не ошибка ‘str’!

2. @101arrowz На самом деле, я хочу загрузить набор данных, и у меня недостаточно информации об этом! некоторые описания доступны по этой ссылке: ( eecs.qmul.ac.uk/mmv/datasets/deap/readme.html#prep )

3. Файлы представляют собой маринованные форматы python / numpy

Ответ №1:

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

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

Ответ №2:

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

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

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