首页Python【Python内置模块】p...

【Python内置模块】pprint——格式化输出数据结构

Python提供了丰富的内置模块,这些模块提供了大量的功能,涵盖了文件操作、网络编程、字符串处理、数学运算、日期和时间处理、系统编程等各个方面。

本系列将会陆续整理分享一些有趣、有用的内置模块。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/13aRH4FMdCOm5GghemfSmDQ?pwd=mnsj提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_built-in_modules





01
简介

pprint 是 Python标准库中的一个模块,它提供了一种更加美观和易读的方式来打印 Python 数据结构(如列表、字典等),使得复杂的数据结构更加清晰易懂。
以下面的数据为例:
data = {
    'name''Alice',
    'age': 30,
    'children': ['Bob''Charlie'],
    'address': {
        'city''NY',
        'street''ST1',
        'zipcode''12345'
    }
}
使用print函数输出的数据结构不够整齐且不易阅读:
{'name''Alice''age': 30, 'children': ['Bob''Charlie'], 'address': {'city''NY''street''ST1''zipcode''12345'}}
而使用pprint函数输出的数据结构会更加整齐、美观,且便于阅读。
{'address': {'city''NY''street''ST1''zipcode''12345'},
 'age': 30,
 'children': ['Bob''Charlie'],
 'name''Alice'}

02
方法

pprint模块提供的方法主要包括以下几种:
  • pp():
美化打印对象。打印对象的格式化表示,后跟换行符。 该函数可在交互式解释器中代替 print() 函数用于检查数值。
pprint.pp(object, stream=None          indent=1, width=80          depth=None, *, compact=False          sort_dicts=False, underscore_numbers=False)
其中:
  • object:要打印的对象。
  • stream:一个文件型对象,可通过调用其 write() 方法将输出写入该对象。如果为 None(默认值),则使用 sys.stdout
  • indent:要为每个嵌套层级添加的缩进量,默认为1。
  • width:输出中每行所允许的最大字符数,,超过宽度的部分会被折行处理,默认为80。
  • depth:可被访问的嵌套层级数量。如果要打印的数据结构具有过深的层级,则其包含的下一层级将用 … 替换。如果为 None(默认值),则不会限制被格式化对象的层级深度。
  • compact:控制长序列的格式化方式。如果为 False(默认值),则序列的每一项将被格式化为单独的行,否则在格式化每个输出行时将根据 width 限制容纳尽可能多的条目,即以更紧凑的方式输出,省略一些空白行和逗号。
  • sort_dicts:如果为 True,则在格式化字典时将基于键进行排序,否则将按插入顺序显示它们,默认为 False
  • underscore_numbers:如果为 True,则在格式化整数时将使用 _ 字符作为千位分隔符,否则将不显示下划线,默认为 False
pprint.pp(data)的输出结果为:
{'name''Alice',
 'age': 30,
 'children': ['Bob''Charlie'],
 'address': {'city''NY''street''ST1''zipcode''12345'}}
pprint.pp(data , indent=4 , width=50 , depth=1 , sort_dicts=True)的输出结果为:
{   'address': {...},
    'age': 30,
    'children': [...],
    'name''Alice'}
通过设置stream参数将输出保存到本地文件:
# 将输出保存到本地文件
with open('output.txt' , 'w') as f:
    pprint.pp(data , stream=f)

  • pprint():
是 sort_dicts 默认设置为 True 的 pp() 函数的别名,它会自动对字典的键值进行排序。
pprint.pprint(data)的输出结果为:
{'address': {'city''NY''street''ST1''zipcode''12345'},
 'age': 30,
 'children': ['Bob''Charlie'],
 'name''Alice'}

  • pformat():
返回对象的美化字符串表示,而不是直接打印。与pp()函数的参数相同。
pprint.pformat(data)的输出结果为:
"{'address': {'city': 'NY', 'street': 'ST1', 'zipcode': '12345'},n 'age': 30,n 'children': ['Bob', 'Charlie'],n 'name': 'Alice'}"

  • isreadable():
isreadable(object)函数用于检查字符串是否是可读的 pprint 格式。返回一个布尔值,表示给定的对象是否可以被解释器读取。
pprint.isreadable(data)
# True

  • isrecursive():
saferepr(object)函数用于判断对象是否需要递归表示。返回一个布尔值,表示给定的对象是否包含递归引用。
stuff = ['spam''eggs''lumberjack''knights''ni']
stuff.insert(0, stuff)  # 创建递归引用

# 判断对象是否需要递归表示
pprint.isrecursive(stuff)
# 输出:True

  • saferepr():
pprint.saferepr 函数主要功能是返回对象的字符串表示,并为递归数据结构提供保护。如果对象的表示形式公开了一个递归条目,该递归引用会被表示为 <Recursion on typename with id=number>。这种表示方式不会进行其他格式化处理。
stuff = ['spam''eggs''lumberjack''knights''ni']
stuff.insert(0, stuff)  # 创建递归引用

# 使用 saferepr 获取安全的字符串表示
safe_repr = pprint.saferepr(stuff)
print(safe_repr)
# 输出: "[<Recursion on list with id=...>, 'spam', 'eggs', 'lumberjack', 'knights', 'ni']"


03
PrettyPrinter类及其方法

PrettyPrinter 类是 pprint 模块中的一个类,它允许用户创建一个对象来自定义和控制美化打印(pretty-printing)的行为。
  • 初始化方法(构造函数):
构造函数用于创建了一个 PrettyPrinter 对象:
PrettyPrinter(indent=1, width=80              depth=None, stream=None, *,               compact=False, sort_dicts=True              underscore_numbers=False)
各参数的含义与 pp() 函数相同。 需要注意的是,它们的顺序不同,而且 sort_dicts 的默认值为 True
  • 方法:
PrettyPrinter类的方法与上面介绍的pprint模块提供的方法相对应,这里就不做过多介绍。
  • pformat(object):
返回对象的格式化表示。
  • pprint(object):
在配置的数据流中打印对象的格式化表示,后跟换行符。
  • isreadable(object):
确定对象的格式化表示是否 “可读”,或是否可以使用 eval() 重构值。 请注意,如果是递归对象,则返回 False。 如果设置了 PrettyPrinter 的深度参数,而对象的深度超过了允许的深度,则返回 False
  • isrecursive(object):
确定对象是否需要递归表示。
  • format(object, context, maxlevels, level):
用于返回对象的格式化版本,并提供额外的信息。用于返回对象的格式化版本,并提供额外的信息。参数:
参数
描述
object
要被格式化的对象。
context
一个字典,包含当前展示上下文中对象的 id() 作为键。如果一个对象需要被展示,而它已经在 context 中表示,则第三个返回值应该为 True。递归调用 format 方法时,应该将容器的额外条目添加到这个字典中。
maxlevels
请求的递归限制深度。如果没有请求限制,则为 0。这个参数应该未经修改地传递给递归调用。
level
当前的递归深度级别。递归调用应该传递一个小于当前调用级别的值。
该方法返回三个值:
1
对象的格式化字符串表示
2
一个布尔值,指示格式化的表示是否可读(即可通过 eval() 重建对象)
3
一个布尔值,指示是否检测到递归
  • 示例:
以下是如何使用 PrettyPrinter 类的一个简单示例。在这个示例中,首先创建了一个 PrettyPrinter 对象,并设置了自定义的缩进和宽度。然后,使用这个对象的 pprint 方法来美化打印一个字典,以及使用 format 方法来获取对象信息。
# 创建一个PrettyPrinter对象,自定义缩进和宽度
printer = pprint.PrettyPrinter(indent=4, width=50)

# 使用PrettyPrinter对象的pprint方法打印数据
printer.pprint(data)

# 使用PrettyPrinter对象的format方法获取对象信息
formatted_output = printer.format(data, {}, None, 0)
print(formatted_output)

输出结果为:

# printer.pprint(data)输出
{   'address': {   'city''NY',
                   'street''ST1',
                   'zipcode''12345'},
    'age': 30,
    'children': ['Bob''Charlie'],
    'name''Alice'}

# printer.format(data, {}, None, 0)输出
("{'address': {'city': 'NY', 'street': 'ST1', 'zipcode': '12345'}, 'age': 30, 'children': ['Bob', 'Charlie'], 'name': 'Alice'}", True, False)


更多内容可以前往官方文档查看:

https://docs.python.org/3/library/pprint.html


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments