2024-04-29 01:57:27 发布
网友
ids = cPickle.loads(gem.value) loads() argument 1 must be string, not unicode
cPickle.dumps()的结果是一个str对象,而不是一个unicode对象。您需要在代码中找到解码pickledstr对象的步骤,并省略该步骤。
cPickle.dumps()
str
unicode
不要试图将unicode对象转换为str对象。两个错误是不对的。示例(Python2.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很可能是“工作的”:
str(gem.value)
>>> ps == str(unicode(ps)) True >>>
您可以通过将gem.value设为字符串而不是unicode来修复它。
gem.value
使用str(gem.value)
cPickle.loads需要一个字节字符串(这正是cPickle.dumps输出的内容),您将为它提供一个unicode字符串。你需要对Unicode字符串进行“编码”以恢复原来给你的字节字符串,但是很难猜出你意外地给它加上了什么编码——也许latin-1或者utf-8(如果ascii别担心,这两种编码中的任何一种都会解码得很好),也许utf-16。。。?如果不知道gem是什么以及您最初如何从cPickle.dumps的输出设置它的value,很难猜测。。。!
cPickle.loads
cPickle.dumps
latin-1
utf-8
ascii
utf-16
gem
value
cPickle.dumps()
的结果是一个str
对象,而不是一个unicode
对象。您需要在代码中找到解码pickledstr
对象的步骤,并省略该步骤。不要试图将
unicode
对象转换为str
对象。两个错误是不对的。示例(Python2.6):您很可能正在使用默认(且效率低下)协议0,该协议生成“人类可读”输出:
这大概是ASCII(但没有文档记录),因此
str(gem.value)
kludge很可能是“工作的”:您可以通过将
gem.value
设为字符串而不是unicode来修复它。使用
str(gem.value)
cPickle.loads
需要一个字节字符串(这正是cPickle.dumps
输出的内容),您将为它提供一个unicode字符串。你需要对Unicode字符串进行“编码”以恢复原来给你的字节字符串,但是很难猜出你意外地给它加上了什么编码——也许latin-1
或者utf-8
(如果ascii
别担心,这两种编码中的任何一种都会解码得很好),也许utf-16
。。。?如果不知道gem
是什么以及您最初如何从cPickle.dumps
的输出设置它的value
,很难猜测。。。!相关问题 更多 >
编程相关推荐