tqdm打印到换行符

Pie*_*sen 24 python progress-bar tqdm

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

我如何才能在同一条线上显示进度?

进度条问题

此代码段说明了我对进度条的使用.

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'")
Run Code Online (Sandbox Code Playgroud)

RAH*_*ARI 43

我经常遇到这个问题,有时position = 0&leave = True不起作用。所以,我找到了一种替代方法。您可以使用tqdm.auto.tqdm

代替tqdm.tqdm 或 代替

from tqdm import tqdm
Run Code Online (Sandbox Code Playgroud)

尝试使用

from tqdm.auto import tqdm
Run Code Online (Sandbox Code Playgroud)

  • 这种格式在 Jupyter Notebooks/Jupyter Lab 中也很好用 (4认同)

Lau*_*IER 22

不推荐使用tqdm_notebook。您必须改用tq.notebook.tqdm

import tqdm.notebook as tq
for i in tq.tqdm(...):
Run Code Online (Sandbox Code Playgroud)

此外,tqdm_notebook 在性能方面确实很糟糕。新库完全纠正了这一点。


Jaq*_*har 18

from tqdm import tqdm_notebook
Run Code Online (Sandbox Code Playgroud)

此命令适用于 google colab。


Jos*_*nte 15

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

while len(tqdm._instances) > 0:
    tqdm._instances.pop().close()
Run Code Online (Sandbox Code Playgroud)

或者更好,感谢 Nirmal 的建议:

tqdm._instances.clear()
Run Code Online (Sandbox Code Playgroud)

  • 该死,这段时间我一直在重新启动 Jupyter 笔记本来修复多行问题。这真的很有帮助,谢谢! (6认同)

Sci*_*iPy 11

尝试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_ ), position=0, leave=True):
    pbar.update()
Run Code Online (Sandbox Code Playgroud)

  • 如果您在笔记本顶部使用“from functools importpartial”、“from tqdm import tqdm”、“tqdm =partial(tqdm,position=0,leave=True)”创建一个 colab 单元,这会将其设置为你只需调用`tqdm(iterable)`,它就会在colab中很好地工作。 (7认同)
  • 这对我来说有一个类似的问题很好 (2认同)
  • `for i in tqdm(range(n),position=0,leave=True)`在 PyCharm 中也适用于我 (2认同)
  • 而不是 tqdm.tqdm。使用 tqdm.auto.tqdm (2认同)

cod*_*eze 7

from tqdm import notebook

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


Sha*_*mad 7

tqdm如果您在 Colab 或 Jupyter Notebook 上使用时遇到此问题,那么...

使用笔记本/colab版本tqdm

>>> from tqdm.notebook import trange, tqdm
>>> for i in trange(1000):
...     ...
Run Code Online (Sandbox Code Playgroud)


小智 6

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

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

我使用下面的代码对此进行了测试,按下space将打印到标准输出但不会中断循环。您想要实现的目标并不是 100% 清楚,因为您的interrupt()函数仅检查所提供字符串的类型。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()
Run Code Online (Sandbox Code Playgroud)

编辑:包括Paul Netherwood tqdm.tqdm.write()指出的 end参数tqdm.write()

  • 请注意,tqdm.write() 有一个可选参数“end”,默认为“\n”,这将导致换行。设置结束='' (3认同)

mjk*_*aak 5

除了上述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)
Run Code Online (Sandbox Code Playgroud)