如何在目录的for循环中使用tqdm获取进度条
How to get progress bar with tqdm in a for loop over directory
我正在尝试有条件地从目录加载一些文件。我希望 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]
这有两个问题:
- 进度更新后,我在 SpyderIPython 控制台中会出现一个新行
- 我实际上是在对文件而不是对以 'Test' 开头的文件进行循环计时,因此进度和剩余时间不准确。
但是,如果我尝试这样做:
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
循环被激活时更新。
----更新----
我也发现here也可以这样使用:
files = [f for f in tqdm(files) if f.startswith('Test')]
这允许通过用 tqdm 包装可迭代来跟踪列表理解的进度。但是在 spyder 中,这会导致每个进度更新单独一行。
----更新2----
它实际上在 spyder 中运行良好。有时如果循环失败,它可能会返回打印一行进度更新。但是最近更新后我很少看到这个。
(此处为 Spyder 维护者) 这是 Spyder 中 TQDM 进度条的已知限制。我建议您在 Github repository.
中打开一个关于它的问题
首先是答案:
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 很有见地。
其次,多行输出的问题是众所周知的,并且由于某些环境因不支持回车 return (\r
) 而被破坏 (https://github.com/tqdm/tqdm#faq-and-known-issues)。
Spyder 中此问题的正确链接是 https://github.com/tqdm/tqdm/issues/512 and https://github.com/spyder-ide/spyder/issues/6172
像这样指定 position=0
和 leave=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))]
我正在尝试有条件地从目录加载一些文件。我希望 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]
这有两个问题:
- 进度更新后,我在 SpyderIPython 控制台中会出现一个新行
- 我实际上是在对文件而不是对以 'Test' 开头的文件进行循环计时,因此进度和剩余时间不准确。
但是,如果我尝试这样做:
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
循环被激活时更新。
----更新----
我也发现here也可以这样使用:
files = [f for f in tqdm(files) if f.startswith('Test')]
这允许通过用 tqdm 包装可迭代来跟踪列表理解的进度。但是在 spyder 中,这会导致每个进度更新单独一行。
----更新2---- 它实际上在 spyder 中运行良好。有时如果循环失败,它可能会返回打印一行进度更新。但是最近更新后我很少看到这个。
(此处为 Spyder 维护者) 这是 Spyder 中 TQDM 进度条的已知限制。我建议您在 Github repository.
中打开一个关于它的问题首先是答案:
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 很有见地。
其次,多行输出的问题是众所周知的,并且由于某些环境因不支持回车 return (\r
) 而被破坏 (https://github.com/tqdm/tqdm#faq-and-known-issues)。
Spyder 中此问题的正确链接是 https://github.com/tqdm/tqdm/issues/512 and https://github.com/spyder-ide/spyder/issues/6172
像这样指定 position=0
和 leave=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))]