3

我正在尝试有条件地从目录中加载一些文件。我想有一个来自 tqdm 的进度条。我目前正在运行这个:

loaddir = r'D:\Folder'
# loop the files in the directory
print('Data load initiated')
for subdir, dirs, files in os.walk(loaddir_res):
    for name in tqdm(files):
        if name.startswith('Test'):
            #do things

这使

Data load initiated

  0%|          | 0/6723 [00:00<?, ?it/s]
  0%|          | 26/6723 [00:00<00:28, 238.51it/s]
  1%|          | 47/6723 [00:00<00:31, 213.62it/s]
  1%|          | 72/6723 [00:00<00:30, 220.84it/s]
  1%|▏         | 91/6723 [00:00<00:31, 213.59it/s]
  2%|▏         | 115/6723 [00:00<00:30, 213.73it/s]

这有两个问题:

  1. 当进度更新时,我在 Spyder 的 IPython 控制台中会出现一个新行
  2. 我实际上是在文件上而不是在以“测试”开头的文件上计时,因此进度和剩余时间不准确。

但是,如果我尝试这个:

loaddir = r'D:\Folder'
# loop the files in the directory
print('Data load initiated')
for subdir, dirs, files in os.walk(loaddir_res):
    for name in files:
        if tqdm(name.startswith('Test')):
            #do things

我收到以下错误。

Traceback (most recent call last):

  File "<ipython-input-80-b801165d4cdb>", line 21, in <module>
    if tqdm(name.startswith('Probe')):

TypeError: 'NoneType' object cannot be interpreted as an integer

我希望只有一行中的进度条在startswith循环被激活时更新。

- - 更新 - -

我在这里还发现它也可以这样使用:

files = [f for f in tqdm(files) if f.startswith('Test')]

它允许通过用 tqdm 包装可迭代来跟踪列表理解的进度。然而,在 spyder 中,这会导致每个进度更新都有一个单独的行。

----UPDATE2---- 它实际上在 spyder 中运行良好。有时如果循环失败,它可能会返回打印一行进度更新。但是在最近的更新之后,我并没有经常看到这种情况。

4

3 回答 3

4

首先是答案:

loaddir = r'D:\surfdrive\COMSOL files\Batch folder\Current batch simulation files'
# loop the files in the directory
print('Data load initiated')
for subdir, dirs, files in os.walk(loaddir_res):
    files = [f for f in files if f.startswith('Test')]
    for name in tqdm(files):
        #do things

这将适用于任何体面的环境(包括裸终端)。解决方案是不提供tqdm未使用的文件名。您可能会发现https://github.com/tqdm/tqdm/wiki/How-to-make-a-great-Progress-Bar很有见地。

其次,多行输出的问题是众所周知的,并且由于不支持回车( )而破坏了某些环境( https://github.com/tqdm/tqdm#faq-and-known-issues\r)。

Spyder 中此问题的正确链接是https://github.com/tqdm/tqdm/issues/512https://github.com/spyder-ide/spyder/issues/6172

于 2018-05-04T14:09:15.790 回答
0

这里是 Spyder 维护者)这是 Spyder 中 TQDM 进度条的已知限制。我建议您在其Github 存储库中打开一个关于它的问题。

于 2018-05-03T00:26:06.987 回答
0

指定position=0leave=True像这样:

for i in tqdm(range(10), position=0, leave=True):
    # Some code

或者在列表理解中:

nums = [i for i in tqdm(range(10), position=0, leave=True)]

值得一提的是,您可以将 `position=0` 和 `leave=True` 设置为默认设置,因此您无需每次都指定它们,如下所示:
from tqdm import tqdm
from functools import partial

tqdm = partial(tqdm, position=0, leave=True) # this line does the magic

# for loop
for i in tqdm(range(10)):
    # Some code

# list comprehension
nums = [for i in tqdm(range(10))]
于 2021-04-15T19:01:37.237 回答