【重要】pprint 模块详解
pprint 模块详解
pprint
是 Python 标准库中的模块,全称为 Pretty Print(美观打印),用于以更易读的方式格式化输出复杂的数据结构(如嵌套字典、列表、集合等)。它通过自动添加缩进、换行和排序等操作,使数据在终端或日志中的展示更加清晰,尤其适合调试、数据分析和日志记录场景。
核心功能
-
自动格式化
- 对嵌套结构添加缩进和换行,避免单行过长输出。
- 默认按字典键排序(Python 3.8+ 可通过参数关闭)。
- 自动处理数据截断(如限制嵌套深度)。
-
控制输出样式
- 支持自定义宽度(
width
)、缩进(indent
)、嵌套深度(depth
)等参数。 - 可将格式化结果作为字符串返回(
pformat
),而非直接打印。
- 支持自定义宽度(
-
调试友好
- 清晰展示数据结构,便于检查内容是否符合预期。
- 支持递归数据结构的检测(如对象引用自身)。
主要方法
1. pprint.pprint(object, *, indent=1, width=80, depth=None, compact=False, sort_dicts=True, stream=None)
- 功能:直接打印格式化后的对象。
- 参数:
indent
:缩进空格数(默认 1)。width
:每行最大字符数(默认 80),超出自动换行。depth
:限制嵌套层级,超出部分显示为...
。compact
:若为True
,尽量紧凑输出(减少换行)。sort_dicts
:是否按键排序字典(Python 3.8+ 默认True
)。stream
:指定输出流(如文件对象),默认为sys.stdout
。
- 示例:
输出:import pprint data = { "name": "Alice", "age": 30, "hobbies": ["reading", "gaming"], "address": { "street": "123 Main St", "city": "Wonderland", "coords": {"lat": 40.7128, "lon": -74.0060} } } pprint.pprint(data, width=40, indent=2)
{ 'address': {'city': 'Wonderland', 'coords': {'lat': 40.7128, 'lon': -74.006}, 'street': '123 Main St'}, 'age': 30, 'hobbies': ['reading', 'gaming'], 'name': 'Alice'}
2. pprint.pformat(object, **kwargs)
- 功能:返回格式化后的字符串,而非直接打印。
- 适用场景:需将结果写入文件或进一步处理时。
- 示例:
formatted_str = pprint.pformat(data, width=50) print("Formatted Data:\n", formatted_str)
3. pprint.PrettyPrinter(**kwargs)
- 功能:创建可复用的格式化打印器对象,支持自定义配置。
- 常用方法:
.pprint(object)
:打印对象。.pformat(object)
:返回格式化字符串。
- 示例:
pp = pprint.PrettyPrinter(indent=4, width=30, sort_dicts=False) pp.pprint(data)
高级用法
1. 限制嵌套深度
nested_data = {"level1": {"level2": {"level3": "deep"}}}
pprint.pprint(nested_data, depth=2)
输出:
{'level1': {'level2': {...}}}
2. 紧凑输出
compact_data = [1, 2, 3, 4, 5]
pprint.pprint(compact_data, compact=True)
输出:
[1, 2, 3, 4, 5]
3. 输出到文件
with open("output.txt", "w") as f:
pprint.pprint(data, stream=f)
4. 自定义对象打印
- 需实现
__repr__
方法,pprint
会优先调用它而非__str__
。
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f"Person(name={self.name!r}, age={self.age})"
people = [Person("Alice", 30), Person("Bob", 25)]
pprint.pprint(people)
输出:
[Person(name='Alice', age=30), Person(name='Bob', age=25)]
与 print()
的对比
场景 | print() 输出 |
pprint 输出 |
---|---|---|
嵌套字典 | 单行显示,难以阅读 | 自动换行缩进,层次清晰 |
长列表 | 可能超出屏幕宽度 | 按宽度自动换行 |
字典键顺序 | 插入顺序(Python 3.7+)或随机 | 默认按键排序(可关闭) |
调试复杂结构 | 需手动展开嵌套 | 直接展示完整结构 |
应用场景
- 调试嵌套数据结构(如 API 响应、JSON 数据)。
- 日志记录:美化复杂对象输出,提升可读性。
- 数据展示:生成报告或文档时格式化数据。
- 递归数据检测:避免无限递归打印。
注意事项
- 性能:对于极大数据结构,
pprint
可能较慢(因需计算格式)。 - 非标准数据类型:自定义类需实现
__repr__
以控制输出。 - JSON 兼容性:
pprint
输出可能包含缩进和换行,若需严格 JSON 格式,建议使用json.dumps(indent=2)
。
总结
pprint
是 Python 中处理复杂数据结构输出的利器,通过自动化格式化和丰富的参数配置,显著提升了代码调试和日志记录的效率。无论是快速查看嵌套字典,还是生成美观的报告,pprint
都能提供清晰、可控的输出方案。