有没有办法让 os.walk 返回文件夹的孩子,而不是后代?

问题描述

我有这个脚本。

    for (root,dirs,file) in os.walk("Missions"):
        for f in file:
            if ('py' in f) and (f!="__init__.py"):
                print("TRYING "+f)
                Mission = importlib.import_module(f.split(".py")[0])
                Mission.Init()

它也在遍历“任务”中的“pycache文件夹,这些python文件是后代。不是孩子,有没有办法将迭代限制为仅直接孩子?

解决方法

愚蠢的解决方案:在进入下一个循环之前显式清空 dirs

    for (root,dirs,file) in os.walk("Missions"):
        for f in file:
            if ('py' in f) and (f!="__init__.py"):
                print("TRYING "+f)
                Mission = importlib.import_module(f.split(".py")[0])
                Mission.Init()
        del dirs[:]  # Deletes contents of dirs,so it doesn't go any deeper

os.walk 允许您改变 dirs 的内容,以更改遍历的目录集;这只是说“不使用它们”。


严肃的解决方法:不需要深入研究的时候,不要打扰使用os.walkos.scandir 更快更直接(os.walk 包装 os.scandir,它只是在树上递归调用):

   for entry in os.scandir("Missions"):
       if entry.is_file():
            if 'py' in entry.name and entry.name != '__init__.py':
                print("TRYING "+f.name)
                Mission = importlib.import_module(f.name.split(".py")[0])
                Mission.Init()

唯一真正的区别是来自 scandir 的项目是 DirEntry objects 比单纯的字符串具有更多的特征(因此需要要求不合格的名称作为 .name 属性,能力测试 entry.is_file() 等)。