1

我有这个目录结构:

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

它没有进入下一个级别。这里有任何帮助解决问题吗?

4

2 回答 2

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
于 2013-11-06T05:45:32.233 回答
2

我认为您可以通过将完整路径名传递到以下内容来解决此问题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

正如在您的原始代码中一样,printRootStructure当您进行递归调用时,您只是将每个文件的最后一部分(这称为“基本名称”)传递给。

工作目录和路径名

每当您在现代计算机上启动程序时,您的程序都会在文件系统中的固定位置运行(这称为“当前工作目录”)。如果您从命令行调用程序,则当前工作目录只是您调用程序名称的路径。如果您通过单击 GUI 环境中的某些内容来调用程序,它可能会变得更加复杂,但一般行为是相同的:您的程序总是在特定的工作目录中运行。

所有路径测试,特别是os.path.isdir,都针对该工作目录进行评估。因此,当您在示例中进行第一次递归调用时,您正在测试os.path.isdir("test1"),它不存在于工作目录中——它只存在于 "test" 中!

解决方法是将完整路径名传递给递归调用。然后,因为当您打印出树时您的全名可能过多,所以我添加了一个调用来os.path.basename仅打印每个文件的基本名称部分。

于 2013-11-06T05:28:14.230 回答