在Jupyter笔记本上实现同一行打印的方法

33

在Python 3中,我们可以使用以下代码轻松地在同一行打印内容。我用这个方法来了解我的循环进度(还有多少时间完成)。然而,在Jupyter中它不起作用(会打印在不同的行上)。

import time
for f in range(10):
    print(f, end='\r', flush=True)
    time.sleep(10)

关闭漂亮打印(%pprint)是行不通的,我也尝试使用sys.stdout.write()来关闭,但我仍然有这个问题。


不,目的是要在同一行上不断打印输出 - 这样可以指示循环内部的进度 ;) - Roelant
我在终端IPython会话和Jupyter笔记本(分别使用Python 3.6.0和3.5.2)中尝试了您的解决方案,在这两种情况下,它都会在同一行上打印输出,替换之前的内容。因此,这似乎不是Jupyter/IPython的普遍问题。 - Pit
4个回答

41

稍后我找到了解决方法(请注意,它在PyCharm Jupyter中无效,只适用于浏览器实现)。对我而言,print 很好用,但是这里建议使用 display,但它会打印字符串周围的单引号。

from time import sleep
from IPython.display import clear_output, display

for f in range(10):
    clear_output(wait=True)
    print(f)  # use display(f) if you encounter performance issues
    sleep(10)

编辑:只想补充一下,TQDM通常也是实现此目标的好工具。它可以显示进度条,并允许您在其下方编写输出或更改每个进度条的描述。另请参见此帖子

import sys
from tqdm import tqdm
from time import sleep

values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
    for i in values:
        pbar.set_description('processed: %d' % (1 + i))
        pbar.update(1)
        sleep(1)

还有一个颜色漂亮的笔记本电脑

from tqdm import tqdm, tqdm_notebook
from time import sleep

for i in tqdm_notebook(range(2), desc='1st loop'):
    sleep(0.01)
    tqdm.write(f"Done task {i}")

24

在print函数前使用\r前缀,并添加end=""参数,如下所示:

print("\r这将被打印在同一行", end="")

这在Google Colab的Jupyter笔记本中有效。


1
也适用于 Databricks 笔记本。 - A. West

16

如果你保留"\r",它将覆盖该行,否则你将附加到该行。你的版本print(f, end='', flush=False)可能会起作用,但我已经在Python 3下阅读过需要使用sys.stdout.write(),最好是添加flush命令。

import sys
import time

for f in range(10):
    #delete "\r" to append instead of overwrite
    sys.stdout.write("\r" + str(f))
    sys.stdout.flush()
    time.sleep(10)

在某些系统上,需要使用stdout.flush才能获得输出


1
因为没有使用额外的库而被点赞。它在JupyterLab中运行良好。 - Azim

0
在某些情况下,当向打印语句提供多个参数时,可能会出现问题。
for i in range(3):
    print(i, "-", i ** 2, end="\r")

以上代码片段在jupyter笔记本中打印出“2 - 0 - 1 - 4”。然而,将单个参数传递给“print”将给出所需的结果“2 - 4”,即“0 - 0”被“1 - 2”覆盖,后者又被“2 - 4”覆盖。
for i in range(3):
    print(f"{i} - {i ** 2}", end="\r")

这里是我正在使用的软件包版本。

# Name                    Version
notebook                  6.4.12
ipython                   8.4.0
python                    3.8.13
jupyter-client            7.3.4                    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接