2017-06-20 98 views
0

我在Jupyter筆記本中運行Python 2.7。我正在處理大型嵌套字典,有時候打印出其中的一個是有幫助的。打印對象的漂亮打印表示的頭(前幾行)

使用pprint.pprint是在屏幕上獲得字典的可讀版本的好方法。但對於特別大的字典,這可能意味着打印一百萬行,這使筆記本電腦崩潰(我認爲我的瀏覽器是無法處理它)。

在bash終端上,我習慣把東西扔進| head,但似乎並沒有在python中做到這一點的通用方法。

我寫這個方法:

from pprint import pformat, pprint 
def pprint_head(to_print,length=10) 
    formatted=pformat(to_print).splitlines() 
    pprint(formatted[:min(len(formatted),length)]) 

它的工作原理,但我不知道

  1. 是否有更好/更規範/內置/「Python化」的方式來做到這一點?
  2. 這些小疙瘩可以改進嗎? (按優先級順序排列):
    • 這對大對象來說很慢。
    • 它使用大量的內存與大對象。
    • 它被打印成字符串列表,因此它具有[在開頭和每行左右引號。

我也想知道,如果有一個「Jupyter」溶液(即告訴Jupyter只接受任何打印的第一個X線?)

回答

1

要達到相同的結果殼頭管,您可以使用Python輕鬆設置輸出過濾器,因爲pprint僅使用其流的write方法。這可能是:

class Head(object): 
    def __init__(self, lines, fd=sys.stdout): 
     self.lines = lines 
     self.fd = fd 
    def write(self, msg): 
     if self.lines <= 0: return 
     n = msg.count('\n') 
     if n < self.lines: 
      self.lines -= n 
      return self.fd.write(msg) 
     ix = 0 
     while(self.lines > 0): 
      iy = msg.find('\n', ix + 1) 
      self.lines -= 1 
      ix = iy 
     return self.fd.write(msg[:ix]) 

然後,您可以用它來pprint只有一個對象的n個第一線那樣:

def pprint_head(to_print,length=10): 
    pprint(to_print, stream=Head(length))