程序在python中递归打印目录结构无法正常工作

时间:2013-11-06 04:27:09

标签: python recursion os.path

我有这个目录结构:

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

它没有进入下一个级别。有什么帮助可以排除故障吗?

2 个答案:

答案 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的调用,只打印每个文件的基名部分。