【重要】pprint 模块详解

pprint 模块详解

pprint 是 Python 标准库中的模块,全称为 Pretty Print(美观打印),用于以更易读的方式格式化输出复杂的数据结构(如嵌套字典、列表、集合等)。它通过自动添加缩进、换行和排序等操作,使数据在终端或日志中的展示更加清晰,尤其适合调试、数据分析和日志记录场景。

核心功能

  1. 自动格式化

    • 对嵌套结构添加缩进和换行,避免单行过长输出。
    • 默认按字典键排序(Python 3.8+ 可通过参数关闭)。
    • 自动处理数据截断(如限制嵌套深度)。
  2. 控制输出样式

    • 支持自定义宽度(width)、缩进(indent)、嵌套深度(depth)等参数。
    • 可将格式化结果作为字符串返回(pformat),而非直接打印。
  3. 调试友好

    • 清晰展示数据结构,便于检查内容是否符合预期。
    • 支持递归数据结构的检测(如对象引用自身)。

主要方法

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+)或随机 默认按键排序(可关闭)
调试复杂结构 需手动展开嵌套 直接展示完整结构

应用场景

  1. 调试嵌套数据结构(如 API 响应、JSON 数据)。
  2. 日志记录:美化复杂对象输出,提升可读性。
  3. 数据展示:生成报告或文档时格式化数据。
  4. 递归数据检测:避免无限递归打印。

注意事项

  • 性能:对于极大数据结构,pprint 可能较慢(因需计算格式)。
  • 非标准数据类型:自定义类需实现 __repr__ 以控制输出。
  • JSON 兼容性pprint 输出可能包含缩进和换行,若需严格 JSON 格式,建议使用 json.dumps(indent=2)

总结

pprint 是 Python 中处理复杂数据结构输出的利器,通过自动化格式化和丰富的参数配置,显著提升了代码调试和日志记录的效率。无论是快速查看嵌套字典,还是生成美观的报告,pprint 都能提供清晰、可控的输出方案。

posted @ 2025-07-25 23:10  nxhujiee  阅读(170)  评论(0)    收藏  举报