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

当使用 tqdm 进度条时: 我可以向循环中的进度条所在的行添加消息吗?

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

148296 次浏览

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

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)(这是默认值)并删除 t.refresh()(感谢 丹尼尔的提示)。

Tqdm 的用法中显示的示例对我来说工作得很好。

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

或者,启动支持 海象操作员 :=的 Python 3.8:

for char in (pbar := tqdm(["a", "b", "c", "d"])):
pbar.set_description(f"Processing {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 ()和一个进度条赋值语句:

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