Program/Python

[Python] dict 출력시 한글 출력 문제

너구리V 2015. 9. 18. 16:37

어떤 언어이건 간에 5년을 경험했다 하더라도,

새로운 형태의 해결 방식은 계속 나오더군요.
파이썬도 그랬습니다.

다음과 같은 dict 가 있습니다.

d={
'_id':'12345',
'kind':'abc',
'name':'가나다'
}

여기에서 '가나다'는 UTF-8 코드 입니다.
(나중에는 u'가나다' 라고 unicode로 설정하여도 마찬가지 입니다)

여기에서 'name'키의 값을 출력해 보겠습니다.

print d['name']
하면,
그 결과는
가나다

라고 결과가 잘 나옵니다.

그런데 문제는 dict 자체를 출력할 때 발생합니다.

print d
{'kind': 'abc', '_id': '12345', 'name': '\xea\xb0\x80\xeb\x82\x98\xeb\x8b\xa4'}

위와 같이 \xea.... 라고 나옵니다.
이 같은 원인은 dict 를 serialize 시키면서 문자를 출력시킬 때
인코딩 무시한 출력 때문입니다.

pprint.pprint(d)
print pprint.pformat(d)
명령 모두,
{'_id': '12345', 'kind': 'abc', 'name': '\xea\xb0\x80\xeb\x82\x98\xeb\x8b\xa4'}
라는 결과가 나옵니다.

이제 해결방법을 보겠습니다.

import pprint
class MyPrettyPrinter(pprint.PrettyPrinter):
def format(self, _object, context, maxlevels, level):
if isinstance(_object, unicode):
return "'%s'" % _object.encode('utf8'), True, False
elif isinstance(_object, str):
_object = unicode(_object,'utf8')
return "'%s'" % _object.encode('utf8'), True, False
return pprint.PrettyPrinter.format(self, _object, context, maxlevels, level)

위와 같이 pprint의 출력 클래스를 상속받아
unicode 인 경우에는 UTF-8로 변환시킨 문자열을 리턴하고,
일반 UTF-8 인경우에는 애초 UTF-8로 되어 있던 문자도 다시 UTF-8로 인코딩시킨
유니코드를 다시 UTF-8로 반환한 결과를 리턴한 것입니다.

이렇게 하여 

MyPrettyPrinter().pprint(d)
print MyPrettyPrinter().pformat(d)
와 같이 출력을 시키면,

{'_id': '12345',' kind': 'abc', 'name': '가나다'}

라는 원하는 결과가 나옵니다.


반응형

'Program > Python' 카테고리의 다른 글

uwsgi / blist  (0) 2014.02.28