为什么我的递归在os.listdir()中不起作用,它不会转到文件夹的下一级

时间:2017-06-27 22:04:08

标签: python linux

下面是我的代码,好像它没有进入递归函数。

#!/usr/bin/python  
import os

def rec(direc, pre):
        for item in os.listdir(direc):
                if os.path.isfile(item):
                        print pre + item + '\n'
                elif os.path.isdir(item):
                        print pre + item + '\n'
                        rec(direc + '/' + item, pre + '---')
rec('.', '-')

我想从这段代码中打印出目录层次结构。它现在做的是基本打印出当前目录中的所有内容。它不会进入当前目录中的文件夹。

我想要的输出如下:因为D是文件夹C中的文件

-B
-C
----D
-E

然而它又回到了我:

-B
-C
-E

我尝试了每一个命令,但它们运行良好。但是,当我把它们放在一起时,我只是没有正常工作。另一件事是,我知道我可以使用os.walk来代替这一点,但我只是想弄清楚为什么我的代码不起作用。谢谢!

2 个答案:

答案 0 :(得分:0)

os.listdir()将返回目录中的文件名列表。

当你以递归方式调用os.path.isfile()时,它实际上只是检查文件名是否只是一个文件。您可能希望它使用os.path.isfile()

检查绝对路径

所以考虑改变:

is os.path.isfile(item):

为:

is os.path.isfile(pre+item):

答案 1 :(得分:0)

您的问题源于经过深思熟虑和/或格式化的路径字符串。而不是连接原始字符串,使用os.path.join()。并确保你总是通过绝对路径。同样,使用字符串方法直接代替" +"通常更有效,通常更具可读性。考虑到这些,工作代码:

import os

def rec(direc, pre):
    for item in os.listdir(direc):
        checkpath = os.path.join(direc, item)
        if os.path.isfile(checkpath):
            print('{}{}\n'.format(pre, item))
        elif os.path.isdir(checkpath):
            print('{}{}\n'.format(pre, item))
            rec(checkpath, '{}---'.format(pre))

rec('.', '-')

警告:os.path.isdir()遵循符号链接,因此您可能最终处于无限递归状态。如果您不需要关注链接并希望避免这种情况,请检查os.path.islink()。