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

时间:2019-03-22 09:12:31

标签: python python-3.x for-loop while-loop

我是python的新手,我对for循环的理解是它们的工作方式与C语言不同,这意味着您不能通过从范围变量中减去1来返回一次迭代。但是,有没有一种容易实现的方法可以返回迭代?

for循环定义为:

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

我希望如果发生某个事件,我可以返回并重新检查当前文件夹及其中的所有文件/文件夹。然后继续。

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

请提出建设性批评意见以改善问题。

3 个答案:

答案 0 :(得分:1)

将路径遍历结果存储在列表中:


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

然后编写自己的循环,以遍历walk_list 带有索引号,一旦要返回,请减去索引号。

答案 1 :(得分:1)

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

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)

答案 2 :(得分:1)

如果您只需要先行步骤(即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