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 相关文章推荐
Python3基础之基本运算符概述
Aug 13 Python
Python Web框架Flask信号机制(signals)介绍
Jan 01 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
Mar 30 Python
Windows中安装使用Virtualenv来创建独立Python环境
May 31 Python
python放大图片和画方格实现算法
Mar 30 Python
python读取和保存视频文件
Apr 16 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
对python3 Serial 串口助手的接收读取数据方法详解
Jun 12 Python
Python字典的概念及常见应用实例详解
Oct 30 Python
python新手学习使用库
Jun 11 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 Python
python 如何用terminal输入参数
May 25 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
php使用json_encode对变量json编码
2014/04/07 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
php中str_pad()函数用法分析
2017/03/28 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
JavaScript方法和技巧大全
2006/12/27 Javascript
JQuery 选择和过滤方法代码总结
2010/11/19 Javascript
js实现仿百度瀑布流的方法
2015/02/05 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
2016/04/26 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
微信端开发--登录小程序步骤
2017/01/11 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
Nuxt项目支持eslint+pritter+typescript的实现
2019/05/20 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
vue+webpack 更换主题N种方案优劣分析
2019/10/28 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
Python中的pass语句使用方法讲解
2015/05/14 Python
Python简单实现Base64编码和解码的方法
2017/04/29 Python
Python 加密的实例详解
2017/10/09 Python
python编程线性回归代码示例
2017/12/07 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
python实现简单俄罗斯方块
2020/03/13 Python
Python实现中英文全文搜索的示例
2020/12/04 Python
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
什么是GWT的Entry Point
2013/08/16 面试题
建筑行业的大学生自我评价
2013/12/08 职场文书
领导干部培训感言
2014/01/23 职场文书
青年教师培训方案
2014/02/06 职场文书
化学教学随笔感言
2014/02/19 职场文书
安全生产承诺书范文
2014/05/22 职场文书
班级团队活动方案
2014/08/14 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2019年怎样写好导游词?
2019/07/02 职场文书
解决pycharm下载库时出现Failed to install package的问题
2021/09/04 Python