一. pprint美觀打印數據結構
pprint
模塊包含一個“美觀打印機”,用于生成數據結構的一個美觀的視圖。格式化工具會生成數據結構的一些表示,不僅能夠由解釋器正確地解析,還便于人閱讀。輸出會盡可能放在一行上,分解為多行時會縮進。
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()
格式化一個對象,并把它作為參數傳入一個數據流(或者是默認的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 .格式化
要格式化一個數據結構而不是把它直接寫入一個流(即用于日志),可以使用pformat()
來構建一個字符串表示。
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()) |
然后可以單獨打印這個格式化的字符串或者記入日志。
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. 任意類
如果一個定制類定義了一個__repr__()
方法,那么pprint()
使用的PrettyPrinter
類還可以處理這樣的定制類。
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
組合的嵌套對象的表示來返回完整的字符串表示。
1
2
3
4
5
|
[node( 'node-1' , []), node( 'node-2' , [node( 'node-2-1' , [])]), node( 'node-3' , [node( 'node-3-1' , [])])] |
4. 遞歸
遞歸數據結構由指向原數據源的引用表示,形式為<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) |
在這個例子中,列表local_data
增加到其自身,這會創建一個遞歸引用。
1
2
3
|
id (local_data) = > 2763816527488 [ 'a' , 'b' , 1 , 2 , <Recursion on list with id = 2763816527488 >] |
5. 限制嵌套輸出
對于非常深的數據結構,可能不要求輸出中包含所有細節。數據有可能沒有適當地格式化,也可能格式化文本過大而無法管理,或者有些數據可能是多余的。
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
參數可以控制美觀打印機遞歸處理嵌套數據結構的深度。輸出中未包含的層次用省略號表示。
1
2
3
|
[(...), (...), (...), (...), (...)] [( 1 , {...}), ( 2 , {...}), ( 3 , [...]), ( 4 , [...]), ( 5 , [...])] |
6.控制輸出寬度
格式化文本的默認輸出寬度為80列。要調整這個寬度,可以在pprint()
中使用參數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 () |
當寬度太小而不能滿足格式化數據結構時,倘若截斷或轉行會導致非法語法,那么便不會截斷或轉行。
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
標志告訴pprint()
嘗試在每一行上放置更多數據,而不是把復雜數據結構分解為多行。
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 () |
這個例子展示了一個數據結構再一行上放不下時,它會分解(數據列表中的第二項也是如此)。如果多個元素可以放置在一行上(如第三個和第四個成員),那么便會把它們放在同一行上。
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' ])] |
到此這篇關于 Python
中的pprint
模塊的文章就介紹到這了,更多相關 Python pprint模塊內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/python960410445/p/15541962.html