Как получить индикатор выполнения с tqdm в цикле for over - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь условно загрузить некоторые файлы из каталога. Я хотел бы иметь индикатор процесса от 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. Когда прогресс обновляется, в моей консоли IPython в Spyder появляется новая строка
  2. На самом деле я зацикливаюсь на файлах, а не на файлах, которые начинаются с «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.

---- UPDATE ----

Я также узнал здесь , что его также можно использовать так:

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

Что позволяет отслеживать прогресс в понимании списка, оборачивая итерируемое в tqdm. Однако в spyder это приводит к отдельной строке для каждого обновления прогресса.

---- UPDATE2 ---- Это на самом деле прекрасно работает в Spyder. Иногда, если цикл завершается неудачей, он может вернуться к печати одной строки обновления прогресса. Но я не видел этого очень часто после последних обновлений.

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

сначала ответ:

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 проницательным.

Во-вторых, проблема с многострочным выводом общеизвестна и из-за того, что Spyder поврежден (https://github.com/tqdm/tqdm#faq-and-known-issues) из-за отсутствия поддержки возврата каретки (\r).

Правильные ссылки для этой проблемы в Spyder: https://github.com/tqdm/tqdm/issues/512 и https://github.com/spyder-ide/spyder/issues/6172

0 голосов
/ 03 мая 2018

( сопровождающий Spyder здесь ) Это известное ограничение индикаторов выполнения TQDM в Spyder. Я бы порекомендовал вам открыть вопрос об этом в репозитории Github .

...