下面是我的代码,好像它没有进入递归函数。
#!/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来代替这一点,但我只是想弄清楚为什么我的代码不起作用。谢谢!
答案 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()。