tqdm打印到换行符

时间:2017-01-17 21:22:06

标签: python tqdm

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

如何让它在同一行显示进度?

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'")

16 个答案:

答案 0 :(得分:7)

tqdm_notebook 已弃用。您必须改为使用 tq.notebook.tqdm

for item in dictArray:
    if item['name'] == aName and item['age'] == aAge:
        return True
return False

此外,在演奏方面,tqdm_notebook确实很惨。新库已完全纠正了该问题。

答案 1 :(得分:6)

我已经意识到在再次使用tqdm之前关闭tqdm实例可以解决Jupyter Lab上新行中打印状态栏的问题:

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

甚至更好,感谢Nirmal的建议:

tqdm._instances.clear()

答案 2 :(得分:3)

您可能已经两次导入了tqdm。重新启动整个笔记本内核,然后再次运行。它将解决问题。由于tqdm内有任何打印语句,它也可能会显示

答案 3 :(得分:3)

我经常遇到这个问题,并找到了一种替代方法。

您可以使用 tqdm.auto.tqdm
而不是 tqdm.tqdm
而不是

from tqdm import tqdm

尝试使用

from tqdm.auto import tqdm

答案 4 :(得分:2)

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

这将打印在进度条上方,并将进度条下移一行。

我使用下面的代码对此进行了测试,按space将打印到标准输出中,但不会中断循环。 由于您的interrupt()函数仅检查提供的字符串的类型,因此尚不清楚您要实现什么目标。 type() built-in function

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()

编辑:如Paul Netherwood所述,包含end的{​​{1}}参数 tqdm.tqdm.write()

答案 5 :(得分:1)

from tqdm import tqdm_notebook

此命令在google colab中有效。

答案 6 :(得分:1)

leave=False用于内部循环在我的情况下有效。

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

使用tqdm==4.38.0Python 3.6.7的环境

答案 7 :(得分:1)

除了前面提到的 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)

答案 8 :(得分:0)

尝试使用tqdm.tnrange()

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

Ongoing image finished image

答案 9 :(得分:0)

尝试使用position=0leave=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_ ), leave=True, position=0):
    pbar.update()

pbar.close()

答案 10 :(得分:0)

我已经尝试过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")

结果,您将变得简单:[100]: |||| ||

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

这里有很多解决方案:Python Progress Bar

答案 11 :(得分:0)

以下内容很骇人,但重置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)

有时候以前的输出是在开始时打印的(我不确定如何删除),但是我发现它比换行符(特别是在长循环中)不那么令人讨厌。

答案 12 :(得分:0)

导入tqdm

from tqdm import tqdm

首先启动代码,在这里使用tqdm,由于输出多行而将其停止。

然后做:

list(getattr(tqdm, '_instances'))

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

如果出现错误:

  

AttributeError:类型对象'tqdm'没有属性'_instances'

您需要首先启动代码,在其中使用tqdm的情况下,只有在提到该启动代码之后。

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

答案 13 :(得分:0)

从tqdm导入笔记本

代替tqdm(循环)
使用notebook.tqdm(looping)

答案 14 :(得分:0)

https://github.com/tqdm/tqdm#parameters 我认为有时候tqdm无法捕捉屏幕宽度 使用ncols = xx限制线宽 例如: tqdm(iter,ncols = 80):#限制线宽= 80

答案 15 :(得分:-5)

尝试使用from tqdm import tqdm_notebook as tqdm代替from tqdm import tqdm