2017-06-20 96 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))