我有这个目录结构:
test1
file1.txt
test2
file2.txt
test3
file3.txt
test4
file4.txt
我打印此目录级别的当前代码如下:
import os
def printRootStructure(dirname,indent=0):
for i in range(indent):
print " ",
print dirname
if os.path.isdir(dirname):
for files in os.listdir(dirname):
printRootStructure(files,indent+1)
printRootStructure("test")
目前打印为
test
file1.txt
test1
它没有进入下一个级别。有什么帮助可以排除故障吗?
答案 0 :(得分:3)
除非您有特定的理由使用递归,否则使用os.walk遍历目录结构会更简单。
import os
import os.path as P
for topdir, subdirs, files in os.walk(starting_point):
print " " * topdir.count(P.sep), P.basename(topdir)
for f in sorted(files):
print " " * (topdir.count(P.sep) + 1), f
答案 1 :(得分:1)
我认为您可以通过将完整路径名称传递到printRootStructure
:
import os
def printRootStructure(dirname,indent=0):
for i in range(indent):
print " ",
print os.path.basename(dirname) # changed
if os.path.isdir(dirname):
for files in os.listdir(dirname):
printRootStructure(os.path.join(dirname,files),indent+1) # changed
与原始代码一样,当您进行递归调用时,您只是将每个文件的最后一部分(这称为“basename”)传递给printRootStructure
。
每次在现代计算机上启动程序时,程序都会在文件系统中的固定位置运行(这称为“当前工作目录”)。如果从commane-line调用程序,则当前工作目录只是调用程序名称的路径。如果通过单击GUI环境中的某些内容来调用程序,它可能会变得更复杂,但一般行为是相同的:您的程序始终在特定的工作目录中运行。
针对该工作目录评估所有路径测试,特别是os.path.isdir
。因此,当您在示例中进行第一次递归调用时,您正在测试工作目录中不存在的os.path.isdir("test1")
- 它只存在于“test”中!
修复方法是将完整路径名传递给递归调用。然后,因为打印树时您的全名可能过多,我添加了对os.path.basename
的调用,只打印每个文件的基名部分。