首页 > 解决方案 > os.walk 如何与 break 语句一起工作?

问题描述

我有以下代码...

for i,v in df_activity.iterrows():
    folder = v["HDFS Location"].split('/')[-1]
    print(i)
    rootdir = '/home/gpumodel/simulation_26_aug/' + folder
    for subdir, dirs, files in os.walk(rootdir):
        for file in files:
            if file.endswith(".json"):
                print(subdir)
                ......
                ......(some process)
                if condition:
                    index_viz_from.append(minval)
                    index_viz_to.append(maxval)
                    break
                break

我的文件夹路径看起来像这样

/home/gpumodel/simulation_26_aug/Khopoli_1/FibreShot/2019-08-28/1/10

文件夹内的文件是这样的

part-00000-d57261c3-e707-4a76-b84c-6576741ecaa2-c000.json  part-00000-e65e0c7e-dfb1-4ca6-b622-17ef8622da04-c000.json  part-00000-e68fa877-4bff-4bff-aecb-c9cc0847c7db-c000.json  _SUCCESS

我想知道上面的代码是如何工作的。根据我的理解,代码递归地运行直到 json 文件存在,当它处理一个 json 文件时,它遇到第一个break语句并从中退出for in files,之后它是转到for subdir, dirs, files in os.walk(rootdir):还是转到第二个break语句?

从程序的工作方式到for subdir, dirs, files in os.walk(rootdir):. 为什么它不去第二个break陈述。是因为给定的缩进吗?如果break之前给定的一个缩进,工作会有所不同吗?

我的代码输出如下:

/home/gpumodel/simulation_26_aug/Khopoli_46/FibreShot/2019-08-29/1/10

/home/gpumodel/simulation_26_aug/Khopoli_47/FibreShot/2019-08-29/1/11

/home/gpumodel/simulation_26_aug/Khopoli_47/FibreShot/2019-08-29/1/10

/home/gpumodel/simulation_26_aug/Khopoli_48/FibreShot/2019-08-29/1/11

标签: pythonfor-loopbreakos.walk

解决方案


老实说,breakif 语句的内部是多余的。您不需要它,因为在 if 语句之后,无论如何您都会立即中断。break如果删除if 语句内部,代码应该以完全相同的方式工作。

此外,break仅影响循环,而不影响 if 语句。您不会“跳出 if 语句”。break带您脱离当前循环。它过早地停止了当前的、最本地的循环,不管它发生了什么。


推荐阅读