Как я могу исправить эту ошибку Unicode / cPickle в Python? - PullRequest
1 голос
/ 01 июня 2010
ids = cPickle.loads(gem.value)

loads() argument 1 must be string, not unicode

Ответы [ 3 ]

8 голосов
/ 01 июня 2010

cPickle.loads хочет получить байтовую строку (что именно то, что выводит cPickle.dumps), и вместо этого вы отправляете ей строку юникода. Вам нужно будет «закодировать» эту строку Unicode, чтобы получить обратно строку байтов, которую dumps первоначально дал вам, но трудно догадаться, какую кодировку вы случайно на нее наложили - возможно, latin-1 или utf-8 (если ascii не волнуйся, любой из этих двух просто отлично расшифрует), может быть utf-16 ...? Трудно догадаться, не зная, что такое gem и как вы изначально установили его value из вывода cPickle.dumps ...!

1 голос
/ 01 июня 2010

Результатом cPickle.dumps() является str объект, а не unicode объект. Вам нужно найти шаг в своем коде, где вы декодируете маринованный объект str, и пропустить этот шаг.

НЕ ПЫТАЙТЕСЬ конвертировать unicode объект в str объект. Два несправедливости не дают права. Пример (Python 2.6):

>>> import cPickle
>>> ps = cPickle.dumps([1,2,3], -1)
>>> ps
'\x80\x02]q\x01(K\x01K\x02K\x03e.'
>>> ups = ps.decode('latin1')
>>> str(ups)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\x80' in position 0: ordinal not in range(128)
>>>

Вы вполне можете использовать стандартный (и неэффективный) протокол 0, который выдает «читабельный» вывод:

>>> ps = cPickle.dumps([1,2,3])
>>> ps
'(lp1\nI1\naI2\naI3\na.'
>>>

который предположительно является ASCII (но не подтверждено документально), так что кладжа str(gem.value) может "" "работать" "":

>>> ps == str(unicode(ps))
True
>>>
0 голосов
/ 01 июня 2010

Вы можете исправить это, сделав gem.value строкой, а не юникодом.

Использование str(gem.value)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...