1
ids = cPickle.loads(gem.value)

loads() argument 1 must be string, not unicode
4

3 回答 3

8

cPickle.loads想要一个字节字符串(这正是cPickle.dumps输出的内容),而您却给它提供了一个 unicode 字符串。您需要对该 Unicode 字符串进行“编码”以取回dumps最初给您的字节字符串,但很难猜出您不小心对它施加了什么编码 - 也许latin-1或者utf-8(如果ascii不担心,这两个中的任何一个)会很好地解码它),也许utf-16......?gem如果不知道它是什么以及如何value从...的输出中最初设置它,就很难猜到它cPickle.dumps

于 2010-05-31T22:33:21.190 回答
1

的结果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)kludge 很可能“”“工作”“”:

>>> ps == str(unicode(ps))
True
>>>
于 2010-05-31T22:30:35.267 回答
-1

您可以通过创建gem.value一个字符串而不是 unicode 来修复它。

采用str(gem.value)

于 2010-05-31T21:52:19.540 回答