以下示例“遍历”目录,打印所有文件的名称,并在所有目录上递归调用自身。
import os
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir,name)
if os.path.isfile(path):
print path
else:
walk1(path)
os.path.join` takes a directory and a file name and joins them into a complete path.
我的练习:修改 walk ,这样就不会打印文件的名称,而是返回一个名字列表。
有人可以解释一下这个函数每行的功能吗?我有一个好主意,但当它到达行else: walk(path)
时,由于没有解释这是做什么的,因此抛弃了我。对于本练习,我认为将其更改为列表的唯一方法是:
def walk1(dir):
res = []
for name in os.listdir(dir):
path = os.path.join(dir,name)
if os.path.isfile(path):
res.append(path)
else:
walk1(path)
return res
我的输出来自如此多的输出线,只有少数几个。我这样做了吗?
答案 0 :(得分:1)
您需要将递归结果添加到已有的内容中。
答案 1 :(得分:1)
这是一个带注释的版本,对递归有一个小修复。
def walk1(dir):
res = []
# for all entries in the folder,
for name in os.listdir(dir):
# compute the path relative to `dir`
path = os.path.join(dir,name)
# include entries recursively.
if os.path.isfile(path):
# the path points to a file, save it.
res.append(path)
else:
# the path points to a directory, so we need
# to fetch the list of entries in there too.
res.extend(walk1(path))
# produce all entries at once.
return res
答案 2 :(得分:1)
我写的一个小模块,pathfinder,让我更容易(在我看来)找到路径。
from pathfinder import pathfind
paths = pathfind(a_dir, just_files=True)
它只是os.walk上面的一层,但消除了围绕它的一些混乱。