我可以向 tqdm 进度条添加消息吗?

Can I add message to the tqdm progressbar?

使用tqdm进度条时:是否可以在循环中将消息添加到与进度条相同的行?

我尝试使用 "tqdm.write" 选项,但它会在每次写入时添加一个新行。我希望每次迭代都在栏旁边显示一条短消息,该消息将在下一次迭代中消失。这可能吗?

您可以更改描述以在进度条前显示一条小消息,如下所示:

from tqdm import trange
from time import sleep
t = trange(100, desc='Bar desc', leave=True)
for i in t:
    t.set_description("Bar desc (file %i)" % i)
    t.refresh() # to show immediately the update
    sleep(0.01)

/编辑:在 tqdm 的最新版本中,您可以使用 t.set_description("text", refresh=True)which is the default) and remove t.refresh() (thanks to Daniel 作为提示)。

Usage of tqdm 中显示的示例对我来说效果很好。

pbar = tqdm(["a", "b", "c", "d"])
for char in pbar:
    pbar.set_description("Processing %s" % char)

或者,启动支持 walrus operator :=:

的 Python 3.8
for char in (pbar := tqdm(["a", "b", "c", "d"])):
    pbar.set_description("Processing %s" % char)

其他答案侧重于动态描述,但对于静态描述,您可以在 tqdm 函数中添加一个 desc 参数。

from tqdm import tqdm

x = [5]*1000
for _ in tqdm(x, desc="Example"):
    pass
 
Example: 100%|██████████████████████████████████| 1000/1000 [00:00<00:00, 1838800.53it/s]

您可以使用 set_postfix 将值直接添加到栏中。

示例:

from tqdm import tqdm
pbar = tqdm(["a", "b", "c", "d"])
num_vowels = 0
for ichar in pbar:
    if ichar in ['a','e','i','o','u']:
        num_vowels += 1
    pbar.set_postfix({'num_vowels': num_vowels})

后缀词典集成到进度条中:

100%|███████████| 4/4 [00:11<00:00,  2.93s/it, num_vowels=1]

您可以使用 set_postfix_str 来代替字典,只在进度条的末尾添加一个字符串。

我个人觉得使用 with 语句更简洁:

from tqdm import tqdm

with tqdm(['a','b','c']) as t:
  for c in t:
    t.set_description(f'{c}')

我个人在for循环之前使用.set_description()和一个progression_bar赋值语句:

from tqdm import tqdm

progression_bar = tqdm(["An", "iterable", "object"])
for element in (progression_bar):
    progression_bar.set_description("Processing « %s »" % str(element))

虽然这里的答案都是正确的,但是tqdm也提供了一个set_postfix_str方法。与 set_postfix 相比的优势在于您可以传递自己的格式化字符串来代替键值对。此外 set_postfix 按字母顺序对键值对进行排序。这是一个 MWE。

from tqdm import tqdm
import numpy as np

loop_obj = tqdm(np.arange(10))

for i in loop_obj:
    loop_obj.set_description(f"Count: {i}")  # Adds text before progessbar
    loop_obj.set_postfix_str(f"Next count: {i+1}")  # Adds text after progressbar