Python中使用pprint函数进行格式化输出的教程


Posted in Python onApril 07, 2015

pprint ? 美观打印

作用:美观打印数据结构

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

以下实例用用到的data包含一下数据

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'

      }),

    ]

1、  打印

要使用这个模块,最简单的方法就是利用pprint()函数

from pprint import pprint
print 'PRINT:'
print data
print 
print 'PPRINT:'
pprint(data)

运行结果:
 

PRINT:
[(1, {'a': 'A', 'c': 'C', 'b': 'B', 'd': 'D'}), (2, {'e': 'E', 'g': 'G', 'f': 'F', 'i': 'I', 'h': 'H', 'k': 'K', 'j': 'J', 'l': 'L'})]
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'})]

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

注意为什么第二个字典中会显示一竖列,因为pprint打印支持8个对象以上的竖列打印

2、  格式化

格式化一个数据结构而不把它直接写至一个流(例如用于日志记录),可以使用pformat()来构造一个字符串表示。 
 

import logging
from pprint import pformat
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'})]

然后可以单独低打印格式化的字符串或者计入日志

splitlines() 按行分割()

rstrip()去除右边的空格 lstrip()去除左边的空格 strip()去除两边空格。默认为去除空格,也可以传入需要从两边或者其中一边去除的字符,如strip(‘a')就是去除字符串两边的字符'a'
3、  任意类

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

from pprint import pprint 
class node(object):
  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)

运行结果:
 

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

由PrettyPrinter组合嵌套对象的表示,从而返回完整字符串表示。
 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)
print local_data

运行结果:
 

id(local_data) => 47458332363520
['a', 'b', 1, 2, <Recursion on list with id=47458332363520>]
['a', 'b', 1, 2, [...]]

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

内置函数id()作用是获得对象的id值,理论上讲每个对象都有一个id值,如果是整数和字符串((相对较小的时候)),那么相同的值会有相同的id值,但是如果是类,及时相同也会有不同的id值。测试如下:

#int or float or lon 都一样(比较小的时候)
a = 65464131311513l
b = 65464131311513l
c = 65464131311513l
print id(a)
print id(b)
print id(c)
print
a = '12312312'
b = '12312312'
c = '12312312'
print id(a)
print id(b)
print id(c)
print 
a = 65464131311513l*11
b = 65464131311513l*11
c = 65464131311513l*11
print id(a)
print id(b)
print id(c)
print
a = '12312312'*11
b = '12312312'*11
c = '12312312'*11
print id(a)
print id(b)
print id(c)
print 
class Test(object):
  def __init__(self):
    pass
a = Test()
b = Test()
c = Test()
print id(a)
print id(b)
print id(c)
print

测试结果:

47010342174992

47010342174992

47010342174992


47010343272096

47010343272096

47010343272096


47010343261568

47010343261648

47010343261688


47010343200944

47010343199152

47010343202352


47010343252304

47010343252944

47010343253008

5、  限制嵌套输出

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

from pprint import pprint 
print 'depth 1 :'
pprint(data,depth=1)
print 
print 'depth 2 :'
pprint(data,depth=2)
print 
print 'depth 3 :'
pprint(data,depth=3)

运行结果:

depth 1 :
[(...), (...)]
depth 2 :
[(1, {...}), (2, {...})]
depth 3 :
[(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'})]

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

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

from pprint import pprint
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'})]
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'})]

宽度大小不能适应格式化数据结构时,如果斩断或转行会引入非法的语法,就不会进行截断或转行。

Python 相关文章推荐
详解Python 数据库 (sqlite3)应用
Dec 07 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 Python
Python利用splinter实现浏览器自动化操作方法
May 11 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
May 15 Python
python 划分数据集为训练集和测试集的方法
Dec 11 Python
Python数据类型之String字符串实例详解
May 08 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
python中利用matplotlib读取灰度图的例子
Dec 07 Python
Django使用Celery加redis执行异步任务的实例内容
Feb 20 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
如何使用python切换hosts文件
Apr 29 Python
Python基于Tkinter编写crc校验工具
May 06 Python
利用QT写一个极简单的图形化Python闹钟程序
Apr 07 #Python
分析Python编程时利用wxPython来支持多线程的方法
Apr 07 #Python
Python中尝试多线程编程的一个简明例子
Apr 07 #Python
Python的Flask框架中Flask-Admin库的简单入门指引
Apr 07 #Python
用Python实现一个简单的线程池
Apr 07 #Python
浅谈Python程序与C++程序的联合使用
Apr 07 #Python
浅要分析Python程序与C程序的结合使用
Apr 07 #Python
You might like
Ajax实时验证用户名/邮箱等是否已经存在的代码打包
2011/12/01 PHP
smarty缓存用法分析
2014/12/16 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
微信小程序-拍照或选择图片并上传文件
2017/01/06 Javascript
js选项卡的制作方法
2017/01/23 Javascript
Windows下使用Nodejs运行js的方法
2017/09/02 NodeJs
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
微信小程序实现自定义加载图标功能
2018/07/19 Javascript
页面内锚点定位及跳转方法总结(推荐)
2019/04/24 Javascript
JS算法题之查找数字在数组中的索引位置
2019/05/15 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
Python文件操作之合并文本文件内容示例代码
2017/09/19 Python
详解如何用OpenCV + Python 实现人脸识别
2017/10/20 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
Html5 页面适配iPhoneX(就是那么简单)
2019/09/05 HTML / CSS
家居设计专业个人自荐信范文
2013/11/26 职场文书
公积金单位接收函
2014/01/11 职场文书
21岁生日感言
2014/02/27 职场文书
年底个人总结范文
2015/03/10 职场文书
2015年教师节慰问信
2015/03/23 职场文书
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技