我无法掌握如何使用python递归列出目录中的文件。所有的递归逻辑都发生在模块本身(os.walk)吗?
def listfiles(path):
for root, dirs, files in os.walk(path):
for f in files:
print(f)
我已经查找了多种方法来递归列出目录中的文件,它们都遵循与上面相同的模式。这似乎是在遍历文件。有人可以向我解释这是如何递归完成的吗?
答案 0 :(得分:3)
os.walk()
是一个生成器。它在生成结果的同时递归地列出目录。请参阅source code,但已简化,可归结为:
def walk(top):
try:
names = os.listdir(top)
except error, err:
return
dirs, nondirs = [], []
for name in names:
if os.path.isdir(os.path.join(top, name)):
dirs.append(name)
else:
nondirs.append(name)
yield top, dirs, nondirs
for name in dirs:
new_path = os.path.join(top, name)
for x in walk(new_path): # recursive call
yield x
此代码列出收集目录和常规文件后的顶部路径,然后递归到嵌套目录。通过显式生成结果来传递递归调用。 Python 3版本在那里使用生成器委派:
for name in dirs:
new_path = os.path.join(top, name)
yield from walk(new_path)
为了简化这一点,我省略了对错误回调,过滤符号链接和自下而上生成的支持。