如何在Python中修复此unicode / cPickle错误?

时间:2010-05-31 21:36:53

标签: python unicode pickle

ids = cPickle.loads(gem.value)

loads() argument 1 must be string, not unicode

3 个答案:

答案 0 :(得分:8)

cPickle.loads需要一个字节字符串(这正是cPickle.dumps输出的),而你正在为它提供一个unicode字符串。您需要“编码”该Unicode字符串以获取dumps最初为您提供的字节字符串,但很难猜测您意外强加给它的编码 - 可能是latin-1或{ {1}}(如果utf-8不担心,这两个中的任何一个都会解码它很棒),也许ascii ......?如果不知道utf-16是什么以及您最初如何从gem的输出中设置value,就很难猜到......

答案 1 :(得分:1)

cPickle.dumps()的结果是str个对象,而不是unicode个对象。您需要在代码中找到解码pickle 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) kludge可能“”“工作”“”:

>>> ps == str(unicode(ps))
True
>>>

答案 2 :(得分:-1)

您可以通过将gem.value设为字符串而不是unicode来修复它。

使用str(gem.value)