一. pprint美觀打印數(shù)據(jù)結(jié)構(gòu)
pprint
模塊包含一個(gè)“美觀打印機(jī)”,用于生成數(shù)據(jù)結(jié)構(gòu)的一個(gè)美觀的視圖。格式化工具會(huì)生成數(shù)據(jù)結(jié)構(gòu)的一些表示,不僅能夠由解釋器正確地解析,還便于人閱讀。輸出會(huì)盡可能放在一行上,分解為多行時(shí)會(huì)縮進(jìn)。
1.打印
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
|
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()
格式化一個(gè)對(duì)象,并把它作為參數(shù)傳入一個(gè)數(shù)據(jù)流(或者是默認(rèn)的sys.stdout
)。
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
|
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 .格式化
要格式化一個(gè)數(shù)據(jù)結(jié)構(gòu)而不是把它直接寫(xiě)入一個(gè)流(即用于日志),可以使用pformat()
來(lái)構(gòu)建一個(gè)字符串表示。
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
|
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()) |
然后可以單獨(dú)打印這個(gè)格式化的字符串或者記入日志。
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
|
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. 任意類(lèi)
如果一個(gè)定制類(lèi)定義了一個(gè)__repr__()
方法,那么pprint()
使用的PrettyPrinter
類(lèi)還可以處理這樣的定制類(lèi)。
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
|
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
組合的嵌套對(duì)象的表示來(lái)返回完整的字符串表示。
1
2
3
4
5
|
[node( 'node-1' , []), node( 'node-2' , [node( 'node-2-1' , [])]), node( 'node-3' , [node( 'node-3-1' , [])])] |
4. 遞歸
遞歸數(shù)據(jù)結(jié)構(gòu)由指向原數(shù)據(jù)源的引用表示,形式為<Recursion on typename with id=number>
1
2
3
4
5
6
7
8
9
|
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) |
在這個(gè)例子中,列表local_data
增加到其自身,這會(huì)創(chuàng)建一個(gè)遞歸引用。
1
2
3
|
id (local_data) = > 2763816527488 [ 'a' , 'b' , 1 , 2 , <Recursion on list with id = 2763816527488 >] |
5. 限制嵌套輸出
對(duì)于非常深的數(shù)據(jù)結(jié)構(gòu),可能不要求輸出中包含所有細(xì)節(jié)。數(shù)據(jù)有可能沒(méi)有適當(dāng)?shù)馗袷交部赡芨袷交谋具^(guò)大而無(wú)法管理,或者有些數(shù)據(jù)可能是多余的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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
參數(shù)可以控制美觀打印機(jī)遞歸處理嵌套數(shù)據(jù)結(jié)構(gòu)的深度。輸出中未包含的層次用省略號(hào)表示。
1
2
3
|
[(...), (...), (...), (...), (...)] [( 1 , {...}), ( 2 , {...}), ( 3 , [...]), ( 4 , [...]), ( 5 , [...])] |
6.控制輸出寬度
格式化文本的默認(rèn)輸出寬度為80列。要調(diào)整這個(gè)寬度,可以在pprint()
中使用參數(shù)width
。
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
|
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 () |
當(dāng)寬度太小而不能滿(mǎn)足格式化數(shù)據(jù)結(jié)構(gòu)時(shí),倘若截?cái)嗷蜣D(zhuǎn)行會(huì)導(dǎo)致非法語(yǔ)法,那么便不會(huì)截?cái)嗷蜣D(zhuǎn)行。
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
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
標(biāo)志告訴pprint()
嘗試在每一行上放置更多數(shù)據(jù),而不是把復(fù)雜數(shù)據(jù)結(jié)構(gòu)分解為多行。
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
|
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 () |
這個(gè)例子展示了一個(gè)數(shù)據(jù)結(jié)構(gòu)再一行上放不下時(shí),它會(huì)分解(數(shù)據(jù)列表中的第二項(xiàng)也是如此)。如果多個(gè)元素可以放置在一行上(如第三個(gè)和第四個(gè)成員),那么便會(huì)把它們放在同一行上。
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
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' ])] |
到此這篇關(guān)于 Python
中的pprint
模塊的文章就介紹到這了,更多相關(guān) Python pprint模塊內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/python960410445/p/15541962.html