【发布时间】:2010-05-31 21:36:53
【问题描述】:
ids = cPickle.loads(gem.value)
loads() argument 1 must be string, not unicode
【问题讨论】:
-
为什么
gem.value是unicode而不是字符串?
ids = cPickle.loads(gem.value)
loads() argument 1 must be string, not unicode
【问题讨论】:
gem.value是unicode而不是字符串?
cPickle.loads 想要一个字节字符串(这正是cPickle.dumps 输出的内容),而您却给它提供了一个 unicode 字符串。您需要“编码”该 Unicode 字符串以取回 dumps 最初给您的字节字符串,但很难猜出您不小心强加于它的编码 - 可能是 latin-1 或 utf-8(如果ascii 别担心,这两个中的任何一个都会很好地解码它),也许utf-16...?如果不知道gem 是什么以及您最初是如何从cPickle.dumps 的输出中设置它的value...!
【讨论】:
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
>>>
【讨论】:
您可以通过将gem.value 设为字符串而不是 unicode 来修复它。
使用str(gem.value)
【讨论】: