当使用pprint时,抑制字符串的unicode前缀

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__?


如果打印每个对象的__str__,您也不会得到引号。这真的是您想要的吗? - abarnert
是的,那就是我想要的。 - jterrace
那你为什么不说呢?为什么接受一个没有去掉引号的答案呢? - abarnert
被接受的答案是可编程的,因此您可以将其适应为任何格式。 - jterrace
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'}

很不幸,它会出现异常UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128),例如{u'ключ': u'значение'}。 - Alexey
2
实际上,您的字符串是纯Unicode字符串,因此它们不能转换为ASCII。在您的情况下,您不应该考虑“删除Unicode前缀”,因为这没有意义。 - Benjamin Toueg
我通过在将值转换为字符串之前对其进行编码来解决了这个问题。 - Alexey

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'}

1

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

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


有没有好的替代方法可以以可读的方式打印大型嵌套结构? - jterrace
哦,我找到了 prettyprint 模块,看起来非常不错。 - jterrace
很有趣的回答@jterrace!简而言之,就是使用print(json.dumps()) - ewerybody

1

(多年后的答案)

只需使用Python3。所有标准字符串默认均为Unicode,因此不需要使用u前缀。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接