Как известно, при печати через pprint, unicode строки печатаются через спецсимволы, что очень неудобно.
Например:
>>> pprint.pprint({1: 'строка'})
{1: '\xd1\x81\xd1\x82\xd1\x80\xd0\xbe\xd0\xba\xd0\xb0'}
>>> pprint.pprint({1: 'строка'.decode('utf8')})
{1: u'\u0441\u0442\u0440\u043e\u043a\u0430'}
Мне надоело с этим мерится, и я написал функцию, которая выводит объекты так же как pprint, но правильно отображает строки.
Вот её код:
import sys
import pprint
def pretty_print(object):
class decoder_stream:
def write(self, s):
if s.startswith("'") and s.endswith("'"):
s = "'%s'" % s[1:-1].decode('string_escape')
elif s.startswith("u'") and s.endswith("'"):
s = "u'%s'" % s[2:-1].decode('unicode_escape').encode('utf8')
sys.stdout.write(s)
pprint.pprint(object, decoder_stream())
Пример использования.
>>> pretty_print({1: 'строка'})
{1: 'строка'}
>>> pretty_print({1: 'строка'.decode('utf8')})
{1: u'строка'}
Принцип работы очень простой, в стандартную функцию pprint мы передаем наш decoder_stream, который преобразует все вхождения строк путем их декодирования.
усовершенствование
import sys
from pprint import PrettyPrinter
class MyPrettyPrinter(PrettyPrinter):
def format(self, *args, **kwargs):
repr, readable, recursive = PrettyPrinter.format(self, *args, **kwargs)
if repr:
if repr[0] in ('"', "'"):
repr = repr.decode('string_escape')
elif repr[0:2] in ("u'", 'u"'):
repr = repr.decode('unicode_escape').encode(sys.stdout.encoding)
return repr, readable, recursive
def pprint(obj, stream=None, indent=1, width=80, depth=None):
printer = MyPrettyPrinter(stream=stream, indent=indent, width=width, depth=depth)
printer.pprint(obj)
pprint({'здравствуй': u'мир'})
pprint({'"здравствуй"': u'"мир"'})
pprint({"'здравствуй'": u"'мир'"})
Материал взят с сайта: http://softwaremaniacs.org/forum/python/25696/
решение взято с http://habrahabr.ru/qa/6820/
import simplejson as json
def pp(obj, *args, **kwargs):
'''pprint с раскодированым выводом русских строк'''
def default(v):
try:
ret = str(v)
except:
ret = 'not json serializable'
if len(ret) > 50:
ret = ret[:50] + ' ...'
return ret
print json.dumps(obj, ensure_ascii=False, indent=4,
default=default).encode('utf-8')
Спасибо!
ОтветитьУдалитьНесколько дней искал решение!!!