运行python时,不断地进行输出,不仅可以将代码运行实时地展示出来,而且让冰冷的机器运行显得有生气。然而,输出的方法对人们的视觉体验来说非常重要,比如过于长的一行字符串非常不符合审美。
pprint(优雅且简约的数据美化输出者)
这是python自带的库之一,所以不需要额外安装,非常方便。
pprint 模块提供了将任意 Python 数据结构 "漂亮地打印 "成可用作解释器输入的形式的能力。如果格式化后的结构包含了非 Python 基本类型的对象,其表示可能无法加载。如果包含了诸如文件、套接字或类等对象,以及其他许多不能用 Python 字面表示的对象,就会出现这种情况。
如果可以,格式化表示法会将对象保留在一行中;如果对象无法在允许的宽度内适应,则会将其分成多行。如果需要调整宽度限制,请明确构造 PrettyPrinter 对象。
在计算显示之前,字典会按键排序。
pprint的类:PrettyPrinter
pprint库只定义了一个类:PrettyPrinter
class pprint.PrettyPrinter(indent=1,
width=80,
depth=None,
stream=None,
*,
compact=False,
sort_dicts=True,
underscore_numbers=False)
构造一个 PrettyPrinter 实例。该构造器可理解多个关键字参数。
关键字参数:stream
(默认为 sys.stdout)是一个类文件对象,输出将通过调用其 write() 方法写入该对象。
-
什么是类文件对象?
文件对象的同义词。将面向文件的应用程序接口(包括 read() 或 write() 等方法)暴露给底层资源的对象。根据创建方式的不同,文件对象可以介导对真实磁盘文件或其他类型的存储或通信设备(如标准输入/输出、内存缓冲区、套接字、管道等)的访问。文件对象也称为类文件对象或流。
文件对象实际上有三类:原始二进制文件、缓冲二进制文件和文本文件。它们的接口定义在 io 模块中。创建文件对象的典型方法是使用 open() 函数。
关键字参数:indent
(默认为 1)指定每个嵌套层的缩进量。
关键字参数:depth
控制可打印的嵌套层数;如果打印的数据结构太深,下一个包含的层级将被 … 代替。默认情况下,格式化对象的深度不受限制。
关键字参数:width
(默认值 80)指定输出中每行所需的最大字符数。如果无法在宽度限制范围内格式化结构,将尽力而为。
关键字参数:compact
compact会影响长序列(列表、元组、集合等)的格式化方式。如果compact为 false(默认值),那么序列中的每个项都将单独格式化在一行中。如果compact为 “true”,则会在每一行输出中格式化宽度所能容纳的条目数。
关键字参数: sort_dicts
如果 sort_dicts 为 true(默认值),字典将按键排序格式化,否则将按插入顺序显示。
关键字参数:underscore_numbers
如果underscore_numbers为 true,整数格式将使用 _ 字符作为千位分隔符,否则不显示下划线(默认值)。
关键字参数:*
其他值用于配置复杂数据结构嵌套的显示方式。
直接使用PrettyPrinter的一些例子
import pprint
stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
stuff.insert(0, stuff[:])
pp = pprint.PrettyPrinter(indent=4) # 设置每进入一层,行前缩进4个字符
pp.pprint(stuff)
结果就像:
[ ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
'spam',
'eggs',
'lumberjack',
'knights',
'ni']
尝试其他参数变化,每种参数组合需要重新示例化PrettyPrinter类:
pp = pprint.PrettyPrinter(width=41, compact=True)
# 每行最长为41个字符,且每个层级中的条目不会优先单独成行
pp.pprint(stuff)
[['spam', 'eggs', 'lumberjack',
'knights', 'ni'],
'spam', 'eggs', 'lumberjack', 'knights',
'ni']
tup = ('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead',
('parrot', ('fresh fruit',))))))))
pp = pprint.PrettyPrinter(depth=6) # 最多显示6个层级的内容,其余将默认用...代替
pp.pprint(tup)
('spam', ('eggs', ('lumberjack', ('knights', ('ni', ('dead', (...)))))))
pprint库中一些快捷方法
这些是作者提供的一些快捷方法,也是基于PrettyPrinter类实现的。也可以看作是使用PrettyPrinter类的一些示例,如果自己的需求无法通过快捷方法满足时,可以照猫画虎来编写自己的快捷方法。
pformat
pprint.pformat(object,
indent=1,
width=80,
depth=None,
*,
compact=False,
sort_dicts=True,
underscore_numbers=False)
以字符串形式返回对象的格式化表示。
indent、width、depth、compact、sort_dicts 和 underscore_numbers 将作为格式化参数传递给 PrettyPrinter 构造函数。
pp
pprint.pp(object,
*args,
sort_dicts=False,
**kwargs)
打印对象的格式化表示,后跟换行符。
如果 sort_dicts 为 false(默认值),字典将按插入顺序显示键值,否则将对字典键值进行排序。 args 和 kwargs 将作为格式化参数传递给 pprint()。
pprint
pprint.pprint(object,
stream=None,
indent=1,
width=80,
depth=None,
*,
compact=False,
sort_dicts=True,
underscore_numbers=False)
在数据流中打印对象的格式化表示,后跟换行符。
如果数据流为空,则使用 sys.stdout。这可以在交互式解释器中代替 print() 函数用于检查数值(甚至可以重新分配 print = pprint.pprint 以在作用域中使用)
indent、width、depth、compact、sort_dicts 和 underscore_numbers 将作为格式化参数传递给 PrettyPrinter 构造函数。
通过一个例子看一下pprint和直接使用PrettyPrinter类的区别
import pprint
stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
stuff.insert(0, stuff)
pprint.pprint(stuff)
[<Recursion on list with id=2675997785280>,
'spam',
'eggs',
'lumberjack',
'knights',
'ni']
isreadable
pprint.isreadable(object)
确定对象的格式化表示是否 “可读”,或是否可以使用 eval() 重构值。对于递归对象,此值总是返回 False。
pprint.isreadable(stuff)
False
isrecursive
pprint.isrescursive(object)
确定对象是否需要递归表示。
saferepr
pprint.saferepr(object)
返回对象的字符串表示,防止递归数据结构。如果对象的表示法暴露了递归条目,递归引用将表示为 。否则,将不对表示形式进行格式化。