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

Dro*_*man 42 python tqdm

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

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

Ghr*_*rua 59

使用tqdm中显示的示例对我很有用.

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

  • 必须标记为正确答案.它比@ gabarous更容易和更清洁 (14认同)
  • @Benham 使用 [`tqdm.write`](https://tqdm.github.io/docs/tqdm/#write) (3认同)
  • @QtRoS 这本质上是相同的答案,除了一个主要的缺失步骤:`pbar.refresh()`。事实上,“set_description()”方法并不意味着在更新循环中使用,它是一种在创建栏后动态设置栏描述的方法。`refresh()` 确保新的描述尽快显示,而不是等待下一次迭代,这可能需要一段时间,具体取决于您的应用程序。此外,这个答案缺少导入语句。 (3认同)

Bha*_*sha 46

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

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

  • @Mark 如果 `desc` 是动态的并且仅在每次迭代中派生怎么办? (5认同)
  • 这当然应该是公认的答案吗?(至少在 2021 年) (3认同)

gab*_*ous 44

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

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

  • `leave=True` 参数在做什么? (3认同)
  • @EduardoPignatelli 它会在完成后留下打印的进度条。否则,“tqdm”会从控制台输出(或任何 sys.stdout,如果它支持某种清理方式)清理进度条。 (3认同)
  • 谢谢。这就是我一直在寻找的东西。 (2认同)

Mar*_*kus 42

您可以使用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})
Run Code Online (Sandbox Code Playgroud)

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

100%|???????????| 4/4 [00:11<00:00,  2.93s/it, num_vowels=1]
Run Code Online (Sandbox Code Playgroud)

您可以使用set_postfix_str将字符串添加到进度条的末尾而不是字典。


Mat*_*ond 8

我个人认为使用以下with语句更清晰:

from tqdm import tqdm

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


lea*_*ner 7

虽然这里的所有答案都是正确的,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
Run Code Online (Sandbox Code Playgroud)