在Python的复杂for循环中返回一次迭代

在Python的复杂for循环中返回一次迭代,python,python-3.x,for-loop,while-loop,Python,Python 3.x,For Loop,While Loop,我是python新手,我对for循环的理解是,它们的工作方式与在C中的不同,这意味着不能通过从范围变量中减去1返回一次迭代。但是,有没有一个简单的实现仍然可以回到迭代中去呢 for循环定义为: for root, dirs, files in os.walk(path): 我希望如果发生某个事件,我可以返回并重新检查当前文件夹以及其中的所有文件/文件夹。然后继续前进 代码基础不是我写的(我只是在添加功能) “路径”中的文件夹和文件数量未知,可能会发生剧烈变化 for循环本身有200行长,调用

我是python新手,我对for循环的理解是,它们的工作方式与在C中的不同,这意味着不能通过从范围变量中减去1返回一次迭代。但是,有没有一个简单的实现仍然可以回到迭代中去呢

for循环定义为:

for root, dirs, files in os.walk(path):
我希望如果发生某个事件,我可以返回并重新检查当前文件夹以及其中的所有文件/文件夹。然后继续前进

  • 代码基础不是我写的(我只是在添加功能)
  • “路径”中的文件夹和文件数量未知,可能会发生剧烈变化
  • for循环本身有200行长,调用的函数值另外500行。(因此改写整个逻辑将很困难)

请提出建设性的批评意见,以改进问题

将路径漫游结果存储在列表中:


步行列表=[]
对于os.walk(路径)中的根、目录和文件:
walk_list.append((根目录、目录、文件))

然后编写自己的循环,用索引号迭代walk_list,一旦想要返回,就用索引号减去。

在触发条件的情况下使用内部循环。这个内部循环将重做触发文件中已经处理过的所有同级,然后返回到通常的检查

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)

如果您只需要前一步(即n-1)中的值,您可以简单地将它们分配给一些变量(prevRoot、PrevDir、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

这个活动看起来怎么样?这是一个简单的检查,是否取决于循环内部的情况?将整个循环体移动到一个函数中,然后将条件添加到循环中,并记住上一次循环迭代中root的先前值,如果条件匹配,则在该根处开始另一个循环,并调用循环体。或者类似的东西,但如果不看到循环,很难说更多。您可以将所有文件夹保存在一个列表中,如果需要,还可以获取上一个列表element@IuliusCurt如果函数查找错误的文件/文件夹名称,则事件可能是错误的名称。由于变量设置为!=0@GittingGud如果其中一个答案对你有效,请随意接受;如果你找到了另一个解决方案,请发表简短的自我回答