我正在尝试有条件地从目录中加载一些文件。我希望在此过程中使用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]
这有两个问题:
- 当进度更新时,在Spyder的IPython控制台中会出现新行。
- 实际上我计时的是循环处理所有文件的时间,而不是以“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
循环激活时更新。
----更新----
我还发现在这里可以像这样使用:链接。files = [f for f in tqdm(files) if f.startswith('Test')]
通过使用tqdm将可迭代对象包装起来,可以使用列表推导式跟踪进度。但是在spyder中,这会导致每个进度更新都显示在单独的一行中。
----更新2---- 实际上,在spyder中它可以正常工作。有时如果循环失败,它可能会回到打印一个进度更新的一行。但是自最新更新以来,我很少见到这种情况。
tqdm(files, desc=subdir)
,以及可能的tqdm(os.walk(...))
。 - casper.dcl\r
,我推测OP已经更新到支持它的版本了。 - casper.dcl