Python轮子:pprint~让你的打印“靓”起来

原文链接:http://www.juzicode.com/python-module-pprint

pprint(Pretty Printer)是Python标准库中的结构化数据打印模块,通过智能格式化使复杂数据结构如字典、列表等具有可读性输出,适用于调试、日志记录和数据展示等场景。

应用场景

  • 调试嵌套数据结构
  • JSON数据可视化
  • API响应解析
  • 配置文件格式化
  • 数据库查询结果展示
  • 机器学习数据集预览

安装与导入

# 标准库无需安装
from pprint import pprint, pformat, PrettyPrinter

使用方法

1)基础美化打印

使用pprint()替代print(),自动格式化嵌套结构并添加缩进,下面的例子对比了print和pprint打印的区别。

# juzicode.com/VX公众号:juzicode
from pprint import pprint, pformat, PrettyPrinter
data = {
    "name": "桔子代码",
    "projects": ["Python教程", "算法专栏", "工具开发"],
    "stats": {"订阅数": 9500, "更新频率": "每周三次"},
    "contact": {"微信": "juzicode", "网站": "juzicode.com"}
}
print(data)
pprint(data)

运行结果:

{'name': '桔子代码', 'projects': ['Python教程', '算法专栏', '工具开发'], 'stats': {'订阅数': 9500, '更新频率': '每周三次'}, 'contact': {'微信': 'juzicode', '网站': 'juzicode.com'}}

{'contact': {'微信': 'juzicode', '网站': 'juzicode.com'},
 'name': '桔子代码',
 'projects': ['Python教程', '算法专栏', '工具开发'],
 'stats': {'更新频率': '每周三次', '订阅数': 9500}}

2)控制缩进层级

通过indent参数调整嵌套结构的缩进空格数,下面的例子中每个item按照缩进2个字符对齐。

# juzicode.com/VX公众号:juzicode
from pprint import pprint, pformat, PrettyPrinter
data = {
    "name": "桔子代码",
    "projects": ["Python教程", "算法专栏", "工具开发"],
    "stats": {"订阅数": 9500, "更新频率": "每周三次"},
    "contact": {"微信": "juzicode", "网站": "juzicode.com"}
}
pprint(data, indent=2)

运行结果:

3)限制输出宽度

使用width参数控制每行最大字符数,避免终端折行。需要注意的是width指定的是最优宽度,如果同一个元素超过了最大限制长度需要分行,并不一定按照width指定的宽度打印。比如下面的例子输出时 tags 的最大宽度大于 20时,如果是同一个元素仍然在一行内打印。

# juzicode.com/VX公众号:juzicode
from pprint import pprint
data = {
    "user": {
        "name": "Alice",
        "age": 30,
        "tags": ["admin", "developer", "python"]
    }
}
pprint(data) # 默认宽度(80)
pprint(data, width=20)
pprint(data, width=70)

运行结果:

4)控制嵌套深度

通过depth参数限制打印的嵌套层级,简化复杂对象。下面的例子是一个4层嵌套的字典,指定depth=2只打印2层数据。

# juzicode.com/VX公众号:juzicode
from pprint import pprint
nested_data = {'a': {'b': {'c': {'d': 1}}}
pprint(nested_data, depth=2)

运行结果:

{'a': {'b': {...}}}

5)获取格式化字符串

使用pformat()返回格式化字符串而非直接打印,便于日志记录。

# juzicode.com/VX公众号:juzicode
from pprint import pprint, pformat
data = {
    "name": "桔子代码",
    "projects": ["Python教程", "算法专栏", "工具开发"],
    "stats": {"订阅数": 9500, "更新频率": "每周三次"},
    "contact": {"微信": "juzicode", "网站": "juzicode.com"}
}
formatted = pformat(data, indent=4)
print(type(formatted))    # 查看类型
print(f"格式化结果:\n{formatted}")

运行结果:

<class 'str'>
格式化结果:
{   'contact': {'微信': 'juzicode', '网站': 'juzicode.com'},
    'name': '桔子代码',
    'projects': ['Python教程', '算法专栏', '工具开发'],
    'stats': {'更新频率': '每周三次', '订阅数': 9500}}

6)自定义打印机

创建PrettyPrinter实例实现全局配置,统一项目输出风格。

# juzicode.com/VX公众号:juzicode
from pprint import pprint, pformat, PrettyPrinter
data = {
    "name": "桔子代码",
    "projects": ["Python教程", "算法专栏", "工具开发"],
    "stats": {"订阅数": 9500, "更新频率": "每周三次"},
    "contact": {"微信": "juzicode", "网站": "juzicode.com"}
}
custom_printer = PrettyPrinter(
    indent=3,
    width=100,
    depth=2,
    compact=False
)
custom_printer.pprint(data)

运行结果:

{  'contact': {'微信': 'juzicode', '网站': 'juzicode.com'},
   'name': '桔子代码',
   'projects': ['Python教程', '算法专栏', '工具开发'],
   'stats': {'更新频率': '每周三次', '订阅数': 9500}}

7)压缩长序列输出

设置compact=True优化长列表显示,减少换行。

# juzicode.com/VX公众号:juzicode
from pprint import pprint
matrix = [[i*j for j in range(1,7)] for i in range(1,9)]
pprint(matrix, compact=False)
pprint(matrix, compact=True)

运行结果:

[[1, 2, 3, 4, 5, 6],
 [2, 4, 6, 8, 10, 12],
 [3, 6, 9, 12, 15, 18],
 [4, 8, 12, 16, 20, 24],
 [5, 10, 15, 20, 25, 30],
 [6, 12, 18, 24, 30, 36],
 [7, 14, 21, 28, 35, 42],
 [8, 16, 24, 32, 40, 48]]
[[1, 2, 3, 4, 5, 6], [2, 4, 6, 8, 10, 12], [3, 6, 9, 12, 15, 18],
 [4, 8, 12, 16, 20, 24], [5, 10, 15, 20, 25, 30], [6, 12, 18, 24, 30, 36],
 [7, 14, 21, 28, 35, 42], [8, 16, 24, 32, 40, 48]]

8)排序字典键输出

使用sort_dicts参数控制字典键的排序方式。

# juzicode.com/VX公众号:juzicode
from pprint import pprint
unsorted_dict = {'z': 1, 'a': 2, 'c': 3}
pprint(unsorted_dict, sort_dicts=False)
pprint(unsorted_dict, sort_dicts=True)

运行结果:

{'z': 1, 'a': 2, 'c': 3} 
{'a': 2, 'c': 3, 'z': 1}

总结

pprint为数据结构可视化提供专业解决方案:

  • 自动识别嵌套结构并缩进
  • 支持深度/宽度/缩进等精细控制
  • 提供字符串格式化输出
  • 兼容所有Python原生数据结构

注意事项:

  • 默认缩进为1空格(可通过indent调整)
  • 超大结构建议限制depth防止内存溢出

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注