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实现linux下使用xcopy的方法
Jun 28 Python
Python处理中文标点符号大集合
May 14 Python
对django中render()与render_to_response()的区别详解
Oct 16 Python
使用python根据端口号关闭进程的方法
Nov 06 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
Python参数传递及收集机制原理解析
Jun 05 Python
Python collections.deque双边队列原理详解
Oct 05 Python
matplotlib教程——强大的python作图工具库
Oct 15 Python
pycharm 复制代码出现空格的解决方式
Jan 15 Python
Python异常类型以及处理方法汇总
Jun 05 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 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数组转换js数组操作及json_encode的用法详解
2013/10/26 PHP
php发送post请求函数分享
2014/03/06 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
PHP网页缓存技术优点及代码实例
2020/07/29 PHP
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
js手机号批量滚动抽奖实现代码
2020/04/17 Javascript
js前端实现图片懒加载(lazyload)的两种方式
2017/04/24 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
AngularJS ui-router刷新子页面路由的方法
2018/07/23 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
使用vue实现HTML页面生成图片的方法
2020/03/12 Javascript
vue-cli —— 如何局部修改Element样式
2020/10/22 Javascript
[02:54]DOTA2英雄基础教程 撼地者
2014/01/14 DOTA
Python 过滤字符串的技巧,map与itertools.imap
2008/09/06 Python
Python语言描述最大连续子序列和
2017/12/05 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
python实现excel读写数据
2021/03/02 Python
在PyCharm中实现关闭一个死循环程序的方法
2018/11/29 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
Django异步任务之Celery的基本使用
2019/03/23 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
2020/07/02 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
2020/07/14 Python
Python使用pickle进行序列化和反序列化的示例代码
2020/09/22 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
会计实习生工作总结的自我评价
2013/10/07 职场文书
开工仪式主持词
2014/03/20 职场文书
幼儿园优秀班主任事迹材料
2014/05/14 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技