Сохранить количество итераций в операторе yield? - PullRequest
0 голосов
/ 29 апреля 2020

Я работаю над дорогой операцией, которая проходит через действительно большую структуру папок (> 100 тыс. Папок с подпапками), а затем анализирует файлы, найденные в этой структуре папок.

Как я и ожидал Этот скрипт, который запускается в течение нескольких часов, возможно, даже дней, я бы хотел встроить в своего рода регистратор «Progress», который регистрирует текущий прогресс, как в logger.info(f'Progress: {int((folders_processed / total_folder_count) * 100)}%').

Проблема, с которой я борюсь, состоит в том, чтобы fold:

  1. Я не знаю точное общее количество папок, потому что я делаю некоторую оценку того, является ли папка релевантной, поэтому простой grep не поможет.
  2. Поскольку он настолько большой, я использую генераторы, чтобы сохранить низкое потребление памяти - и я бы хотел избежать повторного запуска по нему просто для того, чтобы получить общее число.

Это мое (упрощенно) функция:

def folder_walker():
    for dirs, subdirs, files in os.walk(TOP_FOLDER):
        # count total num of "meta"folders
        if 'input' in dirs.lower():
            # count relevant folders
            for file_name in files:
                # count files
                if file_name.endswith('.pdf'):
                    file_type = 'pdf'
                elif file_name.endswith('.doc') or file_name.endswith('.docx'):
                    file_type = 'doc'
                elif file_name.endswith('.xls') or file_name.endswith('.xlsx'):
                    file_type = 'excel'
                if file_type:
                    yield dict(dirs=dirs, file_name=file_name, file_type=file_type)
    # can I "return" the total number of folders / files ?!

walks = folder_walker()

for walk in walks:
    # do stuff
    # here is where I'd count current_progress ?!
  • Я не могу просто сделать len(list(walks)), поскольку он является генератором и может работать только один раз (как указано во многих других потоках, таких как this или это один. Кажется, счетчик ва у go но как сделать это?
  • I думаю Я не могу просто вызвать функцию внутри генератора, чтобы каким-то образом сохранить значение .. это доставляет мне проблемы с областью действия

Существует много информации о различиях между операторами генератора и возврата, но я пока не нашел хорошего решения своей проблемы. Любые указатели будут оценены.

...