iPython/ Jupyter notebook 只清除一行输出

Posted

技术标签:

【中文标题】iPython/ Jupyter notebook 只清除一行输出【英文标题】:iPython/ Jupyter notebook clear only one line of output 【发布时间】:2018-09-08 13:40:48 【问题描述】:

如何在上一行打印 Jupyter 笔记本的状态?我想我正在寻找类似clear_output() 的东西,但只有一行。

示例代码:

from IPython.display import clear_output
import time
print('This is important info!')
for i in range(100):
    print('Processing BIG data file '.format(i))
    time.sleep(0.1)
    clear_output(wait=True)
    if i == 50:
        print('Something bad happened on run .  This needs to be visible at the end!'.format(i))
print('Done.')

当它运行时,它给出了覆盖前一个状态行的行为,但是标记为重要的两条线(带有感叹号和所有内容!)都丢失了。完成后,显示屏会显示:

Done. 

应该说的是:

This is important info!
Something bad happened on run 50.  This needs to be visible at the end!
Done.

This post 建议使用 clear_output() 然后重新打印所有内容。这似乎不切实际,因为我真正倾向于显示的数据量很大(很多图表,数据框,......)。

这是关于 clear_output() 的 two SO 链接。

有没有办法让这项工作不涉及重新打印所有内容?

【问题讨论】:

【参考方案1】:

这个简单的转义序列技巧大部分时间都可以完成这项工作。如果使用得当,\n\r 可以做很多事情。\r: (Carriage Return) (CR) 将光标返回到新行的开头而不移动到新行。\n:(Line Feed) (LF) 移动光标到下一行。

import time
print('This is important info!')
for i in range(100):
    print("\r"+'Processing BIG data file '.format(i),end="")
    time.sleep(0.1)
    if i == 50:
        print("\r"+'Something bad happened on run .  This needs to be visible at the end!'.format(i))
print("\r"+'Done.')

【讨论】:

这对我有用。没有任何额外的包开销。很瘦。【参考方案2】:

我用显示句柄的更新功能让它醒了:

from IPython.display import display
from time import sleep

print('Test 1')
dh = display('Test2',display_id=True)
sleep(1)
dh.update('Test3')

【讨论】:

【参考方案3】:

这样就可以了:

import IPython

IPython.display.display_javascript(r'''
    var el = document.querySelector('.output_text:last-of-type > pre');
    el.innerhtml = el.innerHTML.replace(/(\n.*$)/gm,""); ''', raw=True)

【讨论】:

以上是关于iPython/ Jupyter notebook 只清除一行输出的主要内容,如果未能解决你的问题,请参考以下文章

jupyter notebook怎么更改目录

iPython/ Jupyter notebook 只清除一行输出

如何安装ipython notebook

在 IPython/Jupyter Notebooks 中显示行号

Jupyter (IPython) Notebook 单元格中有多个 Audio 对象

在版本控制下使用 IPython / Jupyter Notebooks