python 进度条由 'tqdm' 创建,每次迭代后出现意外的 values/symbol

python progress bar created by 'tqdm' followed by unexpected values/symbol after each iteration

我正在使用 'tqdm' 包来建立进度条。但是,在奇数 (1,3,5) 的每次迭代之后,都会出现意外的 value/number(在这种情况下,当参数 'ascii' 等于 True 时出现数字 5)。

Fortschritt:  17%|####5                      | 1/6 [00:02<00:11,  2.20s/it]
Fortschritt:  33%|#########                  | 2/6 [00:07<00:14,  3.54s/it]
Fortschritt:  50%|#############5             | 3/6 [00:13<00:13,  4.65s/it]

代码比较复杂,这里就不复制了。。。如果是查找和解决问题所需要的,以后我会精简贴在这里。

如有任何帮助,我们将不胜感激。 :)

--------代码补充----------

from os import makedirs
from tqdm import tqdm
import time

Workflow = ['0','1', '2', '3', '4', '5', '6']
Probenliste = ['A','B']
Oligos= {'Oligo1':'Sequence1', 'Oligo2':'Sequence2'}

for schritt in tqdm(range(len(Workflow)-1), desc='Fortschritt', ascii=True, ncols=75):
    schritt_name = Workflow[schritt+1]
    makedirs(schritt_name)
    for n in range(len(Probenliste)):
        probe = Probenliste[n]
        for primer_name, sequence in Oligos.items():
            time.sleep(1)

根据[GitHub]: tqdm/tqdm - Documentation重点是我的):

  • ascii : bool or str, optional

    If unspecified or False, use unicode (smooth blocks) to fill the meter. The fallback is to use ASCII characters " 123456789#".

我试了一下各种参数,我凭经验发现了这一点(我没有严格的解释),因为我没有深入研究代码:

  • “funky”值来自字符串:" 123456789#""(当 ascii)
  • 它们取决于:
    1. 可迭代(它的长度)
    2. 条(称为)本身的长度,取决于desc的长度和[=29的值=]ncols
    • 看起来像 #1.[=46= 中的元素索引之间的除法(余数) ]#2.

可以使用更简单的代码重现该行为。

code00.py:

#!/usr/bin/env python

import sys
import time

from tqdm import tqdm


def main(*argv):
    data = " " * 6

    cols = (
        49,  # 8, 6, 5, 3, 1, ...
        48,  # 6, 3,  , ...
        47,  # 5,  , ...
        46,  # 3, 6,  , ...
        45,  # 1, 3, 5, 6, 8, ...
        44,  # 
    )

    sleep_time = 0.5

    print("Various lengths:")
    ascii = True
    #ascii = " #"  # !!! DECOMMENT THIS LINE for the problem to go away !!!
    for col in cols:
        for _ in tqdm(data, desc="X", ascii=ascii, ncols=col):
            time.sleep(sleep_time)

    print("\nA combination of parameters that displays all digits")
    for _ in tqdm(range(10), desc="X", ascii=True, ncols=50):
        time.sleep(sleep_time)


if __name__ == "__main__":
    print("Python {:s} {:03d}bit on {:s}\n".format(" ".join(elem.strip() for elem in sys.version.split("\n")),
                                                   64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    rc = main(*sys.argv[1:])
    print("\nDone.")
    sys.exit(rc)

输出(虽然只有最后一个不是很相关,因为它没有捕捉到行为):

[cfati@CFATI-5510-0:e:\Work\Dev\Whosebug\q071951854]> "e:\Work\Dev\VEnvs\py_pc064_03.09_test0\Scripts\python.exe" code00.py
Python 3.9.9 (tags/v3.9.9:ccb0e6a, Nov 15 2021, 18:08:50) [MSC v.1929 64 bit (AMD64)] 064bit on win32

Various lengths:
X: 100%|###########| 6/6 [00:03<00:00,  1.95it/s]
X: 100%|##########| 6/6 [00:03<00:00,  1.96it/s]
X: 100%|#########| 6/6 [00:03<00:00,  1.95it/s]
X: 100%|########| 6/6 [00:03<00:00,  1.95it/s]
X: 100%|#######| 6/6 [00:03<00:00,  1.96it/s]
X: 100%|######| 6/6 [00:03<00:00,  1.95it/s]

A combination of parameters that displays all digits
X: 100%|##########| 10/10 [00:05<00:00,  1.95it/s]

Done.

修正:

使用字符串 " #"#"(对于 ascii),它只包含初始值char (SPACE) 和最后一个 (POUND, #)。这样,就不会有任何可能的中间 char.