Возвращаясь к одной итерации в сложном цикле for в Python - PullRequest
1 голос
/ 22 марта 2019

Я новичок в python, и, насколько я понимаю, циклы for работают не так, как в C, что означает, что вы не можете вернуться на одну итерацию, вычитая 1 из переменной диапазона. Но есть ли простая реализация, чтобы вернуться к итерации?

Цикл for определяется как:

for root, dirs, files in os.walk(path):

Я хочу, чтобы в случае определенного события я мог вернуться и перепроверить текущую папку и все файлы / папки в ней. А затем продолжайте.

  • Основа кода не написана мной (я только добавляю функциональность)
  • количество папок и файлов в «пути» неизвестно и может резко измениться
  • Сам цикл for имеет длину 200 строк и вызывает функции стоимостью еще 500 строк. (так что переписать всю логику было бы сложно)

Пожалуйста, дайте конструктивную критику, чтобы улучшить вопрос.

Ответы [ 3 ]

1 голос
/ 22 марта 2019

Использование внутреннего цикла в случае срабатывания условия.Этот внутренний цикл вернул бы все родственные элементы файла запуска, которые уже были обработаны, и затем вернулся бы к обычной проверке.

for root, dirs, files in os.walk(path):
    if triggered:
        parent = os.path.dirname(root)
        # Recheck all files and folders already checked before
        # bumping into the current file
        for redo_root, redo_dirs, redo_files in os.walk(parent):
            if redo_root == root:
                break  # "And then continue onwards"
            DO_STUFF(redo_root, redo_dirs, redo_files)
    DO_STUFF(root, dirs, files)
1 голос
/ 22 марта 2019

Если вам нужны только значения из предыдущего шага (т.е. n-1), вы можете просто назначить их некоторым переменным (prevRoot, prevDirs, prevFiles) и переписать их после. Из того, что вы написали, я предполагаю, что вам не нужно хранить все предыдущие результаты в списке.

Если это так, вы можете попробовать это:

import os

dir = 'c:\\'

for n, (root, dirs, files) in enumerate(os.walk(dir)):

    if n == 0:
        prevRoot = root
        prevDirs = dirs
        prevFiles = files

    print n
    print (root, dirs, files)
    print (prevRoot, prevDirs, prevFiles)
    #DO YOUR STUFF HERE

    if n > 0:
        prevRoot = root
        prevDirs = dirs
        prevFiles = files
1 голос
/ 22 марта 2019

Сохранить результаты обхода пути в списке:


walk_list=[]
for root, dirs, files in os.walk(path):
    walk_list.append((root,dirs,files))

Затем напишите свой собственный цикл, повторяя список прогулок с порядковым номером . Как только вы захотите вернуться назад, вычтите порядковый номер.

...