Tqdm 打印到换行

我正在使用 python 开发一个小型命令行游戏,其中使用 tqdm 模块显示了一个进度条。我使用 msvcrt 模块侦听用户输入以中断进程。一旦中断,用户可以通过在命令行提示符中输入“重新启动”来重新启动。第二次显示进度条时,它不是用进度更新同一行,而是每次创建一行。

我怎样才能让它在同一条线上显示进度呢?

Progress bar issue

下面的代码片段说明了进度条的用法。

def transfer():
for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format='{l_bar}{bar}|'):
sleep(.1)
if msvcrt.kbhit():
if msvcrt.getwche() == ' ':
interrupt()
break


def interrupt():
type("File transfer interrupted, to restart the transfer, type 'restart'")
111829 次浏览

试试 from tqdm import tqdm_notebook as tqdm而不是 from tqdm import tqdm

尝试使用 tqdm.tqdm.write代替标准的 print()

这将打印上方的进度条和移动进度条下面一行。

我使用下面的代码对此进行了测试,按 space将打印到 stdout 中,但不会中断循环。 您试图实现的目标并不是100% 清楚,因为您的 interrupt()函数只检查所提供字符串的类型。< a href = “ https://docs.python.org/3/library/function tions.html # type”rel = “ norefrer”> type ()内置函数

import tqdm
import msvcrt
from time import sleep


def transfer():
for i in tqdm.tqdm(range(1000), desc="Transfer progress", ncols=100, bar_format='{l_bar}{bar}|'):
sleep(.1)
if msvcrt.kbhit():
if msvcrt.getwche() == ' ':
interrupt()
# break


def interrupt():
tqdm.tqdm.write("File transfer interrupted, to restart the transfer, type 'restart'", end="")


transfer()

编辑: 包括 tqdm.write()end参数 tqdm.tqdm.write()

尝试使用 tqdm.tnrange()

for i in tqdm.tnrange(len(df)):

Ongoing image finished image

Try with position=0 and leave=True

(在 Google Colab中工作的解决方案,以避免打印到换行符)

from tqdm import tqdm
import time


def foo_():
time.sleep(0.3)
range_ = range(0, 10)
total = len(range_)


with tqdm(total=total, position=0, leave=True) as pbar:
for i in tqdm((foo_, range_ ), position=0, leave=True):
pbar.update()

我已经尝试过 tqdm 解决方案,但是由于我使用的是 Spyder (Anaconda) ,所以它在我的情况下不能正常工作,因为在其他答案中提到了写和打印命令之间的冲突。我想出了一个简单而有效的方法,虽然不是最好的方法。

def ybar(progr, total, step=50):
#starts with 1
l2=(progr/total)//(1/step)
if progr==1: print(f'[{total}]: '+'|'*int(l2), end = '')
else:
l1=((progr-1)/total)//(1/step)


ll=int(l2-l1)
if l1 < l2:


for j in range(1,ll+1):
if (int(l1)+j)%5==0:
print('*', end = '')
else:
print('|', end = '')
if progr==total: print("  DONE")

And as result you'll get simple: [100]: ||||||

for i in range(1,101):
ybar(i,len(range(1,101)),50)
#something

这里有很多解决方案: Python 进度条

下面的代码有些古怪,但似乎可以很好地重置 tqdm:

from tqdm import tqdm as tqdm_base
def tqdm(*args, **kwargs):
if hasattr(tqdm_base, '_instances'):
for instance in list(tqdm_base._instances):
tqdm_base._decr_instances(instance)
return tqdm_base(*args, **kwargs)

有时以前的输出在开始时打印(我不知道如何删除) ,但我发现它比换行(特别是在长循环中)少得多的烦人。

进口 tqdm

from tqdm import tqdm

首先启动代码,在使用 tqdm的地方,由于输出多行而停止它。

那就这样做:

list(getattr(tqdm, '_instances'))


for instance in list(tqdm._instances):
tqdm._decr_instances(instance)

If you get an error:

AttributeError: 类型对象‘ tqdm’没有属性‘ _ instance’

你需要 首先开始你的代码,你在哪里使用 tqdm,只有在那个开始代码提到。

在所有这些操作之后,您的 tqdm将工作正常。

from tqdm import tqdm_notebook

this command works in google colab.

不推荐使用 tqdm _ book 。您必须改用 笔记本电脑

import tqdm.notebook as tq
for i in tq.tqdm(...):

此外,tqdm _ book 在性能方面真的很糟糕。

I have realized that closing tqdm instances before using tqdm again fixes the problem of printing status bar in a new line on Jupyter Lab:

while len(tqdm._instances) > 0:
tqdm._instances.pop().close()

或者更好,多亏了尼尔默尔的建议:

tqdm._instances.clear()

You might have imported tqdm twice. Restart the whole notebook kernel and run again. It will solve the issue. It might also be showing because of any print statements inside the tqdm

from tqdm import notebook

而不是 tqdm(looping)
使用 notebook.tqdm(looping)

内部循环的 leave=False在我的案例中起作用了。

for j in tqdm(outer_list):
for i in tqdm(inner_list, leave=False):

环境与 tqdm==4.38.0Python 3.6.7

Https://github.com/tqdm/tqdm#parameters 我认为有时候 tqdm 不能赶上屏幕宽度 限制行的宽度 例如: 限制行宽 = 80

除了上面提到的 position=0, leave=True参数之外,在我的例子中,tqdm的默认 ascii=False参数也在几次迭代后打印到新的行上。通过查看进度条可以很容易地识别这种情况: 如果进度条中有任何格式奇怪的符号(例如问号) ,应该尝试使用 ascii=True

所以这对我很有用:

from tqdm.auto import tqdm
...


with tqdm(data, position=0, leave=True, ascii=True) as iterator:
for x in iterator:
# do stuff
...


iterator.set_postfix_str(msg)

我面对这个问题很多,有时 position = 0leave = True不工作。所以,我找到了一个替代方法。

您可以使用 < strong > tqdm.auto.tqdm 代替 Tqdm.tqdm
or
而不是

from tqdm import tqdm

尝试使用

from tqdm.auto import tqdm

我遇到的这个问题可能并不常见,但是为了防止它对任何人都有用,我在控制台上打印了另一个变量。禁用该打印可以修复该问题。

If you encounter this problem while using tqdm on colab or jupyter notebook, then ...

使用 tqdm的笔记本/实验室版本

>>> from tqdm.notebook import trange, tqdm
>>> for i in trange(1000):
...     ...