Показаны сообщения с ярлыком pprint. Показать все сообщения
Показаны сообщения с ярлыком pprint. Показать все сообщения

вторник, 12 мая 2015 г.

What makes Python Awesome

by Raymond Hettinger
twitter: @raymondh



PyCon 2013
A bit of awesomeness in five minutes

# Search directory tree for all duplicate files
import os, md5, pprint

hashmap = {} # content signature -> list of filenames

for path, dirs, files in os.walk('.'):
    for filename in files:
        fullname = os.path.join(path, filename)
        with open(fullname) as f:
            d = f.read()
        h = hashlib.md5(d).hexdigest()
        filelist = hashmap.setdefault(h, [])
        filelist.append(fullname)
     
pprint.pprint(hashmap)

среда, 14 сентября 2011 г.

РЕШЕНИЕ ПРОБЛЕМЫ С UNICODE ПРИ ИСПОЛЬЗОВАНИИ PPRINT

Как преобразовать словарь Python в удобочитаемый вид?


Как известно, при печати через 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')