2010-05-31 21 views
1
ids = cPickle.loads(gem.value) 

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

爲什麼'gem.value' unicode而不是字符串? – sth 2010-05-31 21:40:29

回答

8

cPickle.loads想要一個字節串(這正是cPickle.dumps輸出)和你重新餵它一個unicode字符串。您需要對該Unicode字符串進行「編碼」以獲取dumps最初給予您的字節字符串,但很難猜測您無意中對其施加了什麼編碼 - 可能是latin-1utf-8(如果ascii不擔心,這兩者中的任何一個都會解碼它,只是很棒),也許utf-16 ...?如果不知道gem是什麼以及如何從cPickle.dumps的輸出中最初設置它的value ...很難猜測!

-1

您可以通過將gem.value設爲一個字符串而不是unicode來修復它。

使用str(gem.value)

+4

-1這是一個混亂,而不是修復。 str()使用默認編碼。你首先需要知道它是如何解碼的。 – 2010-05-31 22:57:19

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)雜牌完全可能「」「工作」「」:

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