6

使用 pprint 模块打印对象时,是否有任何干净的方法来抑制 unicode 字符前缀?

>>> import pprint
>>> pprint.pprint({u'foo': u'bar', u'baz': [u'apple', u'orange', u'pear', u'guava', u'banana'], u'hello': u'world'})
{u'baz': [u'apple', u'orange', u'pear', u'guava', u'banana'],
 u'foo': u'bar',
 u'hello': u'world'}

这看起来很丑陋。有没有办法打印每个对象的 __str__ 值,而不是 __repr__?

4

4 回答 4

10

可以通过重写 PrettyPrinter 对象的 format 方法,并将任何 unicode 对象转换为字符串来完成:

import pprint

def my_safe_repr(object, context, maxlevels, level):
    typ = pprint._type(object)
    if typ is unicode:
        object = str(object)
    return pprint._safe_repr(object, context, maxlevels, level)

printer = pprint.PrettyPrinter()
printer.format = my_safe_repr
printer.pprint({u'foo': u'bar', u'baz': [u'apple', u'orange', u'pear', u'guava', u'banana'], u'hello': u'world'})

这使:

{'baz': ['apple', 'orange', 'pear', 'guava', 'banana'],
 'foo': 'bar',
 'hello': 'world'}
于 2013-06-03T00:38:45.140 回答
2

这可能太多了,但一种可能的方法是在输出流上实现一个包装器:

import pprint,sys,re

class writer :
    def write(self, text):
        text=re.sub(r'u\'([^\']*)\'', r'\1',text)
        sys.stdout.write(text)

wrt=writer()
d = { u'foo': u'bar', u'baz':
        [u'apple', u'orange', u'pear', u'guava', u'banana'],
        u'hello': u'world'}
pp = pprint.PrettyPrinter(stream=wrt)

pp.pprint(d)

输出:

{baz: [apple, orange, pear, guava, banana],
 foo: bar,
 hello: world}

也可以在父对象中加上引号,以便在字符串周围加上单引号,例如,'foo' : 'bar':

text=re.sub(r'u(\'[^\']*\')', r'\1',text)

这给出了:

{'baz': ['apple', 'orange', 'pear', 'guava', 'banana'],
 'foo': 'bar',
 'hello': 'world'}
于 2013-06-03T00:33:27.643 回答
1

不,pprint打印表示。它不是为了制作漂亮的最终用户输出,而是为了以可读的方式打印 Python 对象。

pprint 模块提供了一种以可用作解释器输入的形式“漂亮打印”任意 Python 数据结构的能力。

于 2013-06-03T00:16:58.280 回答
1

(多年后的回答)

只需使用python3。默认情况下,所有标准字符串都是 unicode,因此没有 u 前缀。

于 2020-05-19T08:23:56.933 回答