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

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

왜 'gem.value'가 유니 코드이고 문자열이 아닌가요? – sth

답변

8

cPickle.loads가 정확히 cPickle.dumps 출력) 당신을 인 (바이트 문자열을 원한다 대신 유니 코드 문자열을 제공합니다. dumps이 원래 제공 한 바이트 문자열을 되찾기 위해 유니 코드 문자열을 "인코딩"해야하지만 실수로 인코딩 한 내용을 추측하기가 어려울 수 있습니다. latin-1 또는 utf-8 (ascii은 걱정하지 마십시오. 그 두 가지 중 하나를 그냥 좋은 디코딩 것입니다), 아마도 utf-16 ...? gem이 무엇인지 알지 못하고 원래 어떻게 valuecPickle.dumps ...의 출력으로 설정했는지 모른 채 추측하기는 어렵습니다.

-1

gem.value을 유니 코드가 아닌 문자열로 고정하여 수정할 수 있습니다.

사용 str(gem.value)

+4

-1 그게 괴롭지는 않은데. str()은 기본 인코딩을 사용합니다. 처음에 어떻게 해독되었는지 알 필요가 있습니다. –

1

cPickle.dumps()의 결과는 str 객체가 아닌 unicode 개체입니다. 코드 된 단계에서 절편 된 str 개체를 디코딩 할 단계를 찾아서 그 단계를 생략해야합니다.

unicode 개체를 str 개체로 변환하지 마십시오. 두 가지 잘못은 옳지 않습니다. 예 (파이썬 2.6) :

당신은 잘 생산하는 기본 (비효율적) 프로토콜 0을 사용하고있을 수 있습니다
>>> 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) 
>>> 

"사람이 읽을 수"출력 :

>>> ps = cPickle.dumps([1,2,3]) 
>>> ps 
'(lp1\nI1\naI2\naI3\na.' 
>>> 

아마도 ASCII이다 (그러나 문서화되지 그래서 수) 잘 "" "일이" ""일지 모른다 str(gem.value) kludge :

>>> ps == str(unicode(ps)) 
True 
>>> 
관련 문제