介绍一个非常好用的Python模块-pprint模块,相信你一定会爱上它的
一. pprint美觀打印數據結構
pprint模塊包含一個“美觀打印機”,用于生成數據結構的一個美觀的視圖。格式化工具會生成數據結構的一些表示,不僅能夠由解釋器正確地解析,還便于人閱讀。輸出會盡可能放在一行上,分解為多行時會縮進。
1.打印
from pprint import pprintdata = [(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)。
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()來構建一個字符串表示。
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:725638078 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' import logging from pprint import pformatdata = [(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())然后可以單獨打印這個格式化的字符串或者記入日志。
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類還可以處理這樣的定制類。
from pprint import pprintclass node:def __init__(self, name, contents=[]):self.name = nameself.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組合的嵌套對象的表示來返回完整的字符串表示。
[node('node-1', []),node('node-2', [node('node-2-1', [])]),node('node-3', [node('node-3-1', [])])]4. 遞歸
遞歸數據結構由指向原數據源的引用表示,形式為<Recursion on typename with id=number>
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:725638078 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' from pprint import pprintlocal_data = ['a', 'b', 1, 2] local_data.append(local_data) print('id(local_data) =>', id(local_data)) pprint(local_data)在這個例子中,列表local_data增加到其自身,這會創建一個遞歸引用。
id(local_data) => 2763816527488 ['a', 'b', 1, 2, <Recursion on list with id=2763816527488>]5. 限制嵌套輸出
對于非常深的數據結構,可能不要求輸出中包含所有細節。數據有可能沒有適當地格式化,也可能格式化文本過大而無法管理,或者有些數據可能是多余的。
from pprint import pprintdata = [(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, [...]), (4, [...]), (5, [...])]6.控制輸出寬度
格式化文本的默認輸出寬度為80列。要調整這個寬度,可以在pprint()中使用參數width。
''' 學習中遇到問題沒人解答?小編創建了一個Python學習交流QQ群:725638078 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' from pprint import pprintdata = [(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()當寬度太小而不能滿足格式化數據結構時,倘若截斷或轉行會導致非法語法,那么便不會截斷或轉行。
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()嘗試在每一行上放置更多數據,而不是把復雜數據結構分解為多行。
from pprint import pprintdata = [(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()這個例子展示了一個數據結構再一行上放不下時,它會分解(數據列表中的第二項也是如此)。如果多個元素可以放置在一行上(如第三個和第四個成員),那么便會把它們放在同一行上。
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有幫助!
Python基礎入門教程推薦
Python爬蟲案例教程推薦
總結
以上是生活随笔為你收集整理的介绍一个非常好用的Python模块-pprint模块,相信你一定会爱上它的的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的数据类型和变量的定义及使用
- 下一篇: Python标准库:itertools迭