pprint 模块 - 数据结构美观输出

Python pprint 模块的完整指南,提供数据结构的美观格式化输出功能

分类: stdlib 难度: 初级 更新: 2024-01-15
pprint 格式化输出 调试 数据结构 美观打印

pprint 模块 - 数据结构美观输出

📝 概述

pprint 模块是 Python 标准库模块,全称 pretty printer,可以让各种数据结构更美观地输出。相比于 print() 函数将所有输出结果都显示在一行,pprint 模块打印的数据结构更加完整,每行为一个数据结构,更加方便阅读和调试代码。

🎯 学习目标

  • 掌握 pprint 模块的基本使用方法
  • 了解 pprint 与 print 的区别和优势
  • 学会使用各种参数来控制输出格式
  • 掌握 PrettyPrinter 类的使用方法
  • 学会在实际开发中应用 pprint 进行调试

📋 前置知识

  • Python 基本语法和数据类型
  • 字典、列表等数据结构的基本操作
  • 了解标准输出和文件输出概念

🔍 详细内容

pprint 与 print 的对比

普通的 print() 函数输出结果都在一行,不方便查看复杂的数据结构:

## 使用 print 输出复杂数据结构
game = {
    'players': [
        {'name': 'player_1', 'hp': 3}, 
        {'name': 'player_2', 'hp': 5}
    ]
}

print(game)
# 输出: {'players': [{'name': 'player_1', 'hp': 3}, {'name': 'player_2', 'hp': 5}]}

而 pprint 模块可以让数据结构以更美观的格式输出:

import pprint

## 使用 pprint 输出同样的数据结构
pprint.pprint(game, width=4)
# 输出:
# {'players': [{'hp': 3,
#               'name': 'player_1'},
#              {'hp': 5,
#               'name': 'player_2'}]}

基本用法示例

from pprint import pprint

# 创建测试数据
name_age = {
    "张三": 24,
    "小明": 18,
    "小开": 22,
}

# 按条件筛选出大于20岁的人
name_big20 = {key: value for key, value in name_age.items() if value >= 20}
pprint(name_big20)

# 按提供人名找出信息
name_in = ["张三", "小王"]
name_yet = {key: value for key, value in name_age.items() if key in name_in}
pprint(name_yet)

💡 实际应用

pprint.pprint() 函数

pprint.pprint(object, stream=None, indent=1, width=80, depth=None, *, compact=False)

参数说明

参数名 类型 必需 默认值 说明
object Any 要打印的对象
stream TextIO sys.stdout 输出流,默认是屏幕输出
indent int 1 缩进空格数
width int 80 每行最大宽度,超过宽度会换行
depth int None 限制数据的层级,可以限制过多的嵌套
compact bool False 若设为 True,则输出会在接近 width 限制才进行换行

使用示例

import pprint

# 测试数据
stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
stuff.insert(0, stuff[:])  # 添加嵌套结构

# 使用不同的缩进
pprint.pprint(stuff, indent=4)
# 输出:
# [   ['spam', 'eggs', 'lumberjack', 'knights', 'ni'],
#     'spam',
#     'eggs',
#     'lumberjack',
#     'knights',
#     'ni']

# 使用 compact 参数
pprint.pprint(stuff, width=41, compact=True)
# 输出:
# [['spam', 'eggs', 'lumberjack',
#   'knights', 'ni'],
#  'spam', 'eggs', 'lumberjack', 'knights',
#  'ni']

pprint.pformat() 函数

pprint.pformat(object, indent=1, width=80, depth=None, *, compact=False)

和 pprint.pprint() 的区别是,该函数不会打印到输出流,而是返回一个格式化字符串:

import pprint

stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']
stuff.insert(0, stuff)

# 获取格式化字符串
formatted_string = pprint.pformat(stuff)
print(f"格式化结果:\n{formatted_string}")

# 处理递归引用
pprint.pprint(stuff)
# 输出:
# [<Recursion on list with id=...>,
#  'spam',
#  'eggs',
#  'lumberjack',
#  'knights',
#  'ni']

PrettyPrinter 类

当需要复用格式化设置时,可以创建 PrettyPrinter 对象:

class pprint.PrettyPrinter(indent=1, width=80, depth=None, stream=None, *, compact=False)

使用示例

import pprint

# 创建自定义的 PrettyPrinter 对象
pp = pprint.PrettyPrinter(width=40, compact=True)

# 测试数据
game = {
    'players': [
        {'name': 'player_1', 'hp': 3}, 
        {'name': 'player_2', 'hp': 5}
    ]
}

stuff = ['spam', 'eggs', 'lumberjack', 'knights', 'ni']

# 使用自定义格式打印
pp.pprint(game)
# 输出:
# {'players': [{'hp': 3,
#               'name': 'player_1'},
#              {'hp': 5,
#               'name': 'player_2'}]}

pp.pprint(stuff)
# 输出:
# ['spam', 'eggs', 'lumberjack',
#  'knights', 'ni']

高级用法

控制输出深度

import pprint

# 创建深层嵌套的数据结构
deep_data = {
    'level1': {
        'level2': {
            'level3': {
                'level4': {
                    'data': 'deep_value'
                }
            }
        }
    }
}

# 限制输出深度
pprint.pprint(deep_data, depth=2)
# 输出会在第2层停止,更深的层次显示为 {...}

自定义输出流

import pprint
import io

# 创建字符串缓冲区
string_buffer = io.StringIO()

# 将输出重定向到字符串缓冲区
data = {'key1': 'value1', 'key2': [1, 2, 3, 4, 5]}
pprint.pprint(data, stream=string_buffer)

# 获取输出内容
output = string_buffer.getvalue()
print(f"捕获的输出:\n{output}")

⚠️ 注意事项

  • pprint 是一个模块,使用前需要先导入
  • 对于简单的数据结构,pprint 和 print 的输出差别不大
  • pprint 主要优势体现在复杂的嵌套数据结构上
  • width 参数不会强制分割单个对象,比如一段长字符串不会被换行
  • 递归引用的对象会被特殊标记显示,避免无限递归

🔗 相关内容

📚 扩展阅读

🏷️ 标签

pprint 格式化输出 调试 数据结构 美观打印


最后更新: 2024-01-15
作者: Python 文档团队
版本: 1.0

作者: Python 文档团队

版本: 1.0

讨论与反馈

欢迎在下方留言讨论,分享你的学习心得或提出问题。评论基于GitHub Issues,需要GitHub账号。