python数据格式化之pprint

2017年06月17日 13:56:33

阅读数:2291

简介

pprint模块 提供了打印出任何Python数据结构类和方法。

模块方法:

1.class pprint.PrettyPrinter(indent=1,width=80,depth=Nonestream=None)

创建一个PrettyPrinter对象

indent --- 缩进,width --- 一行最大宽度,

depth --- 打印的深度,这个主要是针对一些可递归的对象,如果超出指定depth,其余的用"..."代替。

eg: a=[1,2,[3,4,],5]  a的深度就是2; b=[1,2,[3,4,[5,6]],7,8] b的深度就是3

stream ---指输出流对象,如果stream=None,那么输出流对象默认是sys.stdout

2.pprint.pformat(object,indent=1,width=80depth=None)

返回格式化的对象字符串

3.pprint.pprint(object,stream=None,indent=1width=80depth=None)

输出格式的对象字符串到指定的stream,最后以换行符结束。

4.pprint.isreadable(object)

判断对象object的字符串对象是否可读

5.pprint.isrecursive(object)

判断对象是否需要递归的表示

eg: pprint.isrecursive(a)  --->False

        pprint.isrecursive([1,2,3])-->True

6.pprint.saferepr(object)

返回一个对象字符串,对象中的子对象如果是可递归的,都被替换成<Recursionontypename withid=number>.这种形式。

PrettyPrinter 对象具有的方法与上面类似,不在赘述。

[python] view plain copy

 
  1. import pprint
  2. data = (
  3. "this is a string", [1, 2, 3, 4], ("more tuples",
  4. 1.0, 2.3, 4.5), "this is yet another string"
  5. )
  6. pprint.pprint(data)

输出:

('this is a string',
[1, 2, 3, 4],
('more tuples', 1.0, 2.3, 4.5),
'this is yet another string')

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()函数

1
2
3
4
5
6
from pprint import pprint
print 'PRINT:'
print data
print 
print 'PPRINT:'
pprint(data)

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
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()来构造一个字符串表示。

1
2
3
4
5
6
7
8
9
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())

运行结果:

1
2
3
4
5
6
7
8
9
10
11
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类还可以处理这些定制类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

运行结果:

1
2
3
[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>。

1
2
3
4
5
6
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

运行结果:

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#int or float or lon 都一样(比较小的时候)
= 65464131311513l
= 65464131311513l
= 65464131311513l
print id(a)
print id(b)
print id(c)
print
= '12312312'
= '12312312'
= '12312312'
print id(a)
print id(b)
print id(c)
print 
= 65464131311513l*11
= 65464131311513l*11
= 65464131311513l*11
print id(a)
print id(b)
print id(c)
print
= '12312312'*11
= '12312312'*11
= '12312312'*11
print id(a)
print id(b)
print id(c)
print 
class Test(object):
    def __init__(self):
        pass
= Test()
= Test()
= 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、  限制嵌套输出

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

1
2
3
4
5
6
7
8
9
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)

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。

1
2
3
4
5
from pprint import pprint
for width in [80,5]:
    print 'WIDTH = ', width
    pprint(data,width = width)
    print

运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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数据格式化之pprint的更多相关文章

  1. 【转】python数据格式化之pprint

    pprint – 美观打印 作用:美观打印数据结构 pprint 包含一个“美观打印机”,用于生成数据结构的一个美观视图.格式化工具会生成数据结构的一些表示,不仅可以由解释器正确地解析,而且便于人类阅 ...

  2. Python数据格式化

    Python有两种格式化字符串的方式,使用%或者使用内置format()函数. 使用%格式化字符串 在Python中使用%来格式化字符串,用法和效果类似于C语言中的%.格式为:%特定的转换类型 %da ...

  3. python json.dumps()函数输出json格式,使用indent参数对json数据格式化输出

    在python中,要输出json格式,需要对json数据进行编码,要用到函数:json.dumps json.dumps() :是对数据进行编码 #coding=gbkimport json dict ...

  4. python 文件与数据格式化

    https://www.cnblogs.com/li-zhi-qiang/p/9269453.html       文件和数据格式化 https://www.cnblogs.com/li-zhi-qi ...

  5. Python基础篇(五)_文件和数据格式化

    Python基础篇_文件和数据格式化 文件的使用:文件打开.关闭.读写 文件打开:通过open()函数打开文件,并返回一个操作文件的变量. 使用语法:<变量名> = (<文件路径以及 ...

  6. Python 注释和键盘输入,输出数据格式化

    Python中的注释有单行注释和多行注释: Python中单行注释以 # 开头,例如: # 这是一个注释 print("Hello, World!") 多行注释用三个单引号 ''' ...

  7. python基础之 数据格式化

    %还是format 皇城PK Python中格式化字符串目前有两种阵营:%和format,我们应该选择哪种呢? 自从Python2.6引入了format这个格式化字符串的方法之后,我认为%还是form ...

  8. Python 字符串格式化

    Python 字符串格式化 Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存 一 ...

  9. python字符串格式化方法 format函数的使用

      python从2.6开始支持format,新的更加容易读懂的字符串格式化方法, 从原来的% 模式变成新的可读性更强的 花括号声明{}.用于渲染前的参数引用声明, 花括号里可以用数字代表引用参数的序 ...

随机推荐

  1. python -- 字典 集合

    1.字典          定义:字典是以 key :value 的形式来保存数据,用{} 来表示,存储的是 key : value        查找效率比较高(注:字典存储数据时,用的是hash值 ...

  2. layer中每次用到都要查来查去的功能

    1.关闭当前弹出层 var index = parent.layer.getFrameIndex(window.name); setTimeout(function(){parent.layer.cl ...

  3. 3D打印GCODE文件学习(一)

    我家有一个天威的入门级的3D打印机.它有一个配套的软件叫“Rrint-RiteCoLiDo Repetier-Host V1.5.5”,用来连接.控制打印机.同时它可以加载各种切片软件,对各种3D模型 ...

  4. vue-router进阶-2-路由原信息

    //meta字段,一个路由匹配到的所有路由记录会暴露为 $route 对象(还有在导航守卫中的路有对象)的 $route.matched 数组. const router = new VueRoute ...

  5. redis缓存工具类

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis ...

  6. 对TCP协议握手的理解(转)

    reference:https://www.cnblogs.com/awkflf11/p/9191708.html 目录: 31.Tcp握手的一些问题? 21.Tcp三次握手及SYN攻击: 四次握手? ...

  7. 路由器桥接尝试WDS

    第一步:设置主路由器192.168.1.1. 第二步:设置副路由器. 进入副路由器的设置界面 点击「网络参数」->「LAN口设置」 把副路由器的LAN地址设置为192.168.1.2防止与主路由 ...

  8. L333 Should You Listen to Music While You Work?

    Should You Listen to Music While You Work? "Whistle while you work" is classic advice, str ...

  9. MacOs 安装cordova报无权访问题解决方案

    在MacOS安装cordova后,执行cordova -v报错: Error: EACCES: permission denied, open '/Users/jianuonuo/.config/co ...

  10. 关于Ble通信库BluetoothKit的使用 以及可能出现的问题分析

    首先,这个库是用于BLE(低功耗蓝牙)通信的,地址:https://github.com/dingjikerbo/BluetoothKit 当然,也可以选择根据andorid提供的底层接口自己完成这部 ...