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

어떤 언어이건 간에 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': '가나다'}

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


어느분께는 도움이 되셨기를...


덧글

  • 死海文書 2013/12/18 19:19 # 답글

    아이고 살았습니다.
  • 지훈현서아빠 2013/12/19 08:58 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 0xfffffff 2014/03/20 03:06 # 삭제 답글

    저 한글로 된 값을 변수에 넣을수는 없나요?
  • 지훈현서아빠 2014/03/21 12:04 #

    dict 에 이미 있는 값을 변수로 넣는다고요?
    v = d['k1']['k2']
    와 같은 식으로 안 되나요?
    아님 약간만 수정하면 xpath 처럼 접근하게 만들 수도 있습니다.
    참고하셔요~
  • 무명씨 2015/05/19 12:35 # 삭제 답글

    이것 알아낼려고 꽤 오랫동안 고생했었는데, 감사합니다~
  • 지훈현서아빠 2015/05/19 13:46 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 감사합니다 2015/07/30 17:50 # 삭제 답글

    감사합니다! 덕분에 저도 잘 해결했습니다.
    이 방법으로 리스트를 pprint하는 경우에도 혹시 해결할 수 있는 방법이 있나요? 알려주시면 정말 감사드리겠습니다.
    알려주신 해결방법을 기반으로 직접 만들 수 있다면 좋을텐데 제가 이해가 부족하여 질문드립니다. ㅜㅜ
  • 나현재 2015/11/12 20:04 # 삭제 답글

    감사합니다. ^^
  • 2015/11/13 02:33 # 삭제 답글 비공개

    비공개 덧글입니다.
  • 지훈현서아빠 2015/11/13 09:14 #

    이렇게 좋은 팁을 알려주시다니요~ 감사합니다 ^^
  • 감사합니다. 2016/06/01 17:40 # 삭제 답글

    오....저정말 이거떄문에 머리가 너무아팠는데
    정말정말정말정말 감사합니다
  • 지훈현서아빠 2016/06/01 21:10 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • smylere 2016/07/13 20:04 # 삭제 답글

    이거 때문에 오늘 하루종일 고생했는데 결국 답이 있었네요 ㅠㅠ 덕분에 퇴근 할 수 있게되었습니다 감사합니다.
  • 지훈현서아빠 2016/07/14 11:39 #

    도움이 되셨다니 저의 보람입니다.. ^^
  • 관자 2017/07/07 07:26 # 삭제 답글

    고맙습니다. 해결되었습니다.
  • 지훈현서아빠 2017/07/07 08:44 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 파릇파릇하게 2017/08/24 16:13 # 삭제 답글

    아이고 감사합니다 :) 덕분에 살았네요
  • 지훈현서아빠 2017/08/24 16:29 #

    도움이 되셨다니 저의 보람입니다~ ^^
  • 감사합니다 2017/09/19 15:20 # 삭제 답글

    진짜 너무 감사합니다 ㅠㅠ 제가 그렇게 오랫동안 찾던 거 인데 ㅠㅠㅠ 너무너무너무 고맙습니다 !!
  • 지훈현서아빠 2017/09/20 10:48 #

    도움이 되셨다니 저의 보람입니다 ^^
댓글 입력 영역

구글애드텍스트