如何解决有没有办法让 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.walk
; os.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()
等)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。