递归函数不递归

Recursive function does not recurse

我在Python 3...

中定义了一个函数
>>> import os
>>> def find(path):
...   if not os.path.isdir(path):
...     return []
...   out_list = []
...   for f in os.listdir(path):
...     if os.path.isdir(f):
...       for g in find(f):
...         out_list.append(g)
...     else:
...       out_list.append(f)
...   return out_list
... 

这似乎会爬下 path 的树并列出每个文件(无论如何对我来说),但是当我执行它时...

>>> find('..')
['CDB', 'dv', 'DataIntegrityUtility', 'cdb', 'libvrs']

那里的所有结果都是包含文件的目录。那里不应该有更多吗?

在python中存在os.walk

os.walk('path') => 递归遍历目录,它给出目录的元组,

子目录和文件

for x,y,z in os.walk('path'):
    # z is the directory
    # y is subdirectories
    # x is the files

问题是,

for f in os.listdir(path):

将迭代路径中包含的 "leaf" 名称,例如,如果 path 是 '/tmp/fooand it containsbarandbaz, thenfwill bebar, thenbaz`.

但是然后你检查是否 os.path.isdir('bar') —— 这意味着 'bar' 如果在当前目录中有的话, 而不是 [=20 下的那个=]!

所以你需要添加类似

的内容
f = os.path.join(path, f)

就在 for 语句下方,以便其余逻辑正确运行。 (如果你出于某种原因只想要 out_list 中的叶名称,你可以使用 os.path.basename 从完整的路径字符串中提取它们)。