IPython - 让打印默认显示长变量的头尾

4 投票
1 回答
6920 浏览
提问于 2025-04-18 01:22

(仅适用于在IPython中工作,无论是终端还是QTConsole,不适用于Notebook)有没有办法让普通的打印语句(是的,2.7版本)在变量超过某个大小时,自动只打印出头部和尾部(或者仅打印头部)呢?

如果我用print dataframe打印一个太大的pandas数据框,pandas会自动只打印出前面的部分。我希望在列表和numpy数组上也能这样,这样下次我不小心打印一个巨大的数组时,就不会看到100页的数字了。(我知道我可以写一个函数来实现这个,但我习惯性地使用打印,所以我想知道有没有办法控制IPython显示多少内容——其实,我更希望能改变控制台显示的内容,而不是程序本身的输出。)

1 个回答

1

你用 print 语句能做的事情不多,但你可以对 ipython 的输出做点文章,看看这两个命令:

In [13]: x = range(3)

In [14]: x
Out[14]: [0, 1, 2]

In [15]: print x
[0, 1, 2]

首先,x 会把 Out[14] 的值赋给表达式,然后显示这个 Out[14]

你可以对 ipython 进行一些修改,让它以不同的方式显示输出。根据我的了解,ipython 内部使用了 pprint 或者它的一个副本。不过,简单地修改 pprint.pprint/pprint.pformat/pprint.PrettyPrinter 是不够的,你需要对 ipython 进行更深入的修改。

其次,print x 直接触及了 Python 的核心。在 Python 2.x 中,你无法改变 print 的行为。而在 Python 3.x 中,print() 只是一个函数,你可以对它进行修改。

如果你打印的是你自己定义的类的对象,可以像 numpy 那样重新定义 __str____repr__

numpy.set_printoptions(threshold=2)
numpy.array(range(10)).__str__()
'[0 1 2 ..., 7 8 9]'
print numpy.array(range(10))
[0 1 2 ..., 7 8 9]

最后,ipython 还提供了一个 %page 的魔法命令,你可以输入 %page x,如果 x 的表示内容足够大,你会被带到一个 less 或类似的分页工具中,这样你就可以一页一页地查看这个文本表示。

附注:ipython 可以通过“traits”进行扩展,这对我来说仍然是个谜,但也许你可以用 traits 来解决第一个问题。

撰写回答