Python中的pprint模块


Posted in Python onNovember 27, 2021

一. pprint美观打印数据结构

pprint模块包含一个“美观打印机”,用于生成数据结构的一个美观的视图。格式化工具会生成数据结构的一些表示,不仅能够由解释器正确地解析,还便于人阅读。输出会尽可能放在一行上,分解为多行时会缩进。

1.打印

 

from pprint import pprint

data = [

    (1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

    (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H',

         'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}),

    (3, ['m', 'n']),

    (4, ['o', 'p', 'q']),

    (5, ['r', 's', 't''u', 'v', 'x', 'y', 'z']),

]

print('PRINT:')

print(data)

print()

print('PPRINT:')

pprint(data)

pprint()格式化一个对象,并把它作为参数传入一个数据流(或者是默认的sys.stdout)。

 

PRINT:
[(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}), (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H', 'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}), (3, ['m', 'n']), (4, ['o', 'p', 'q']), (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]



PPRINT:

[(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

 (2,

  {'e': 'E',

   'f': 'F',

   'g': 'G',

   'h': 'H',

   'i': 'I',

   'j': 'J',

   'k': 'K',

   'l': 'L'}),

 (3, ['m', 'n']),

 (4, ['o', 'p', 'q']),

 (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]

2 .格式化

要格式化一个数据结构而不是把它直接写入一个流(即用于日志),可以使用pformat()来构建一个字符串表示。

 

import logging

from pprint import pformat



data = [

    (1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

    (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H',

         'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}),

    (3, ['m', 'n']),

    (4, ['o', 'p', 'q']),

    (5, ['r', 's', 't''u', 'v', 'x', 'y', 'z']),

]

logging.basicConfig(

    level=logging.DEBUG,

    format='%(levelname)-8s %(message)s',

)

logging.debug('Logging pformatted data')

formatted = pformat(data)

for line in formatted.splitlines():

    logging.debug(line.rstrip())

然后可以单独打印这个格式化的字符串或者记入日志。

 

DEBUG    Logging pformatted data

DEBUG    [(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

DEBUG     (2,

DEBUG      {'e': 'E',

DEBUG       'f': 'F',

DEBUG       'g': 'G',

DEBUG       'h': 'H',

DEBUG       'i': 'I',

DEBUG       'j': 'J',

DEBUG       'k': 'K',

DEBUG       'l': 'L'}),

DEBUG     (3, ['m', 'n']),

DEBUG     (4, ['o', 'p', 'q']),

DEBUG     (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]

3. 任意类

如果一个定制类定义了一个__repr__()方法,那么pprint()使用的PrettyPrinter类还可以处理这样的定制类。

 

from pprint import pprint

class node:

    def __init__(self, name, contents=[]):

        self.name = name

        self.contents = contents[:]



    def __repr__(self):

        return (

                'node(' + repr(self.name) + ', ' +

                repr(self.contents) + ')'

        )

trees = [

    node('node-1'),

    node('node-2', [node('node-2-1')]),

    node('node-3', [node('node-3-1')]),

]

pprint(trees)

利用由PrettyPrinter组合的嵌套对象的表示来返回完整的字符串表示。

[node('node-1', []),

 node('node-2', [node('node-2-1', [])]),

 node('node-3', [node('node-3-1', [])])]

4. 递归

递归数据结构由指向原数据源的引用表示,形式为<Recursion on typename with id=number>

from pprint import pprint

local_data = ['a', 'b', 1, 2]

local_data.append(local_data)

print('id(local_data) =>', id(local_data))

pprint(local_data)

在这个例子中,列表local_data增加到其自身,这会创建一个递归引用。

id(local_data) => 2763816527488

['a', 'b', 1, 2, <Recursion on list with id=2763816527488>]

5. 限制嵌套输出

对于非常深的数据结构,可能不要求输出中包含所有细节。数据有可能没有适当地格式化,也可能格式化文本过大而无法管理,或者有些数据可能是多余的。

from pprint import pprint

data = [

    (1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

    (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H',

         'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}),

    (3, ['m', 'n']),

    (4, ['o', 'p', 'q']),

    (5, ['r', 's', 't''u', 'v', 'x', 'y', 'z']),

]

pprint(data, depth=1)

pprint(data, depth=2)

使用depth参数可以控制美观打印机递归处理嵌套数据结构的深度。输出中未包含的层次用省略号表示。

[(...), (...), (...), (...), (...)]

[(1, {...}), (2, {...}), (3, [...]), (4, [...]), (5, [...])]

6.控制输出宽度

格式化文本的默认输出宽度为80列。要调整这个宽度,可以在pprint()中使用参数width

 

from pprint import pprint

data = [

    (1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

    (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H',

         'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}),

    (3, ['m', 'n']),

    (4, ['o', 'p', 'q']),

    (5, ['r', 's', 't''u', 'v', 'x', 'y', 'z']),

]

for width in [80, 5]:

    print('WIDTH =', width)

    pprint(data, width=width)

    print()

当宽度太小而不能满足格式化数据结构时,倘若截断或转行会导致非法语法,那么便不会截断或转行。

WIDTH = 80

[(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

 (2,

  {'e': 'E',

   'f': 'F',

   'g': 'G',

   'h': 'H',

   'i': 'I',

   'j': 'J',

   'k': 'K',

   'l': 'L'}),

 (3, ['m', 'n']),

 (4, ['o', 'p', 'q']),

 (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]

WIDTH = 5

[(1,

  {'a': 'A',

   'b': 'B',

   'c': 'C',

   'd': 'D'}),

 (2,

  {'e': 'E',

   'f': 'F',

   'g': 'G',

   'h': 'H',

   'i': 'I',

   'j': 'J',

   'k': 'K',

   'l': 'L'}),

 (3,

  ['m',

   'n']),

 (4,

  ['o',

   'p',

   'q']),

 (5,

  ['r',

   's',

   'tu',

   'v',

   'x',

   'y',

   'z'])]

compact标志告诉pprint()尝试在每一行上放置更多数据,而不是把复杂数据结构分解为多行。

from pprint import pprint

data = [

    (1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

    (2, {'e': 'E', 'f': 'F', 'g': 'G', 'h': 'H',

         'i': 'I', 'j': 'J', 'k': 'K', 'l': 'L'}),

    (3, ['m', 'n']),

    (4, ['o', 'p', 'q']),

    (5, ['r', 's', 't''u', 'v', 'x', 'y', 'z']),

]

for width in [80, 5]:

    print('WIDTH =', width)

    pprint(data, width=width)

    print()

这个例子展示了一个数据结构再一行上放不下时,它会分解(数据列表中的第二项也是如此)。如果多个元素可以放置在一行上(如第三个和第四个成员),那么便会把它们放在同一行上。

WIDTH = 80

[(1, {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'D'}),

 (2,

  {'e': 'E',

   'f': 'F',

   'g': 'G',

   'h': 'H',

   'i': 'I',

   'j': 'J',

   'k': 'K',

   'l': 'L'}),

 (3, ['m', 'n']),

 (4, ['o', 'p', 'q']),

 (5, ['r', 's', 'tu', 'v', 'x', 'y', 'z'])]



WIDTH = 5

[(1,

  {'a': 'A',

   'b': 'B',

   'c': 'C',

   'd': 'D'}),

 (2,

  {'e': 'E',

   'f': 'F',

   'g': 'G',

   'h': 'H',

   'i': 'I',

   'j': 'J',

   'k': 'K',

   'l': 'L'}),

 (3,

  ['m',

   'n']),

 (4,

  ['o',

   'p',

   'q']),

 (5,

  ['r',

   's',

   'tu',

   'v',

   'x',

   'y',

   'z'])]

到此这篇关于 Python中的pprint模块的文章就介绍到这了,更多相关 Python pprint模块内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
在Python中使用Mako模版库的简单教程
Apr 08 Python
python的Tqdm模块的使用
Jan 10 Python
Python扩展内置类型详解
Mar 26 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
Python求解正态分布置信区间教程
Nov 20 Python
python科学计算之narray对象用法
Nov 25 Python
python中property和setter装饰器用法
Dec 19 Python
重写django的model下的objects模型管理器方式
May 15 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 Python
python 高阶函数简单介绍
Feb 19 Python
python 多态 协议 鸭子类型详解
Nov 27 #Python
Python机器学习实战之k-近邻算法的实现
Python Django项目和应用的创建详解
python playwright 自动等待和断言详解
Nov 27 #Python
Python实现制作销售数据可视化看板详解
Python 如何利用ffmpeg 处理视频素材
实操Python爬取觅知网素材图片示例
You might like
详解php的socket通信
2015/08/11 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
php 数组元素快速去重
2017/05/05 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
javascript定义函数的方法
2010/12/06 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
javascript深拷贝的原理与实现方法分析
2017/04/10 Javascript
JavaScript中的 new 命令
2019/05/22 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
详解Python函数作用域的LEGB顺序
2016/05/14 Python
Python实现在线音乐播放器
2017/03/03 Python
Python实现批量读取图片并存入mongodb数据库的方法示例
2018/04/02 Python
Anaconda入门使用总结
2018/04/05 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
pyqt5使用按钮进行界面的跳转方法
2019/06/19 Python
Django 路由控制的实现
2019/07/17 Python
selenium中get_cookies()和add_cookie()的用法详解
2020/01/06 Python
css3针对移动端卡顿问题的解决(动画性能优化)
2020/02/14 HTML / CSS
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
匡威西班牙官网:Converse西班牙
2019/10/01 全球购物
精彩的大学生自我评价
2013/11/17 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
企业2014年度工作总结
2014/12/10 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
小班上学期幼儿评语
2014/12/30 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
驳回起诉裁定书
2015/05/19 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书
2016教师节感恩话语
2015/12/09 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP