在Python中递归打印文件目录

时间:2014-03-14 17:12:03

标签: python recursion

我正在尝试弄清楚如何使用适当的缩进打印出目录中的每个项目。我到目前为止的代码如下:

import os

def traverse(pathname,d):
    'prints a given nested directory with proper indentation'
    indent = ''
    for i in range(d):
        indent = indent + '  '
    for item in os.listdir(pathname):
        try:
            newItem = os.path.join(pathname, item)
            traverse(newItem,d+1)
        except:
            print(indent + newItem)

我输出的打印输出了测试目录中的所有文件,但没有打印出文件夹名称。我得到的是:

>>> traverse('test',0)
test/fileA.txt
  test/folder1/fileB.txt
  test/folder1/fileC.txt
    test/folder1/folder11/fileD.txt
  test/folder2/fileD.txt
  test/folder2/fileE.txt
>>>

输出应该是什么:

>>> traverse('test',0)
test/fileA.txt
test/folder1
  test/folder1/fileB.txt
  test/folder1/fileC.txt
  test/folder1/folder11
    test/folder1/folder11/fileD.txt
test/folder2
  test/folder2/fileD.txt
  test/folder2/fileE.txt
>>>

任何人都可以让我知道我需要使用代码来获取文件夹名称吗?我试图打印出路径名,但是每次Python打印出一个文件名时它都会重复文件夹名,因为它在for循环中。非常感谢正确方向的推动!

2 个答案:

答案 0 :(得分:1)

您需要打印文件名,无论它是否是目录,如:

for item in os.listdir(pathname):
    try:
        newItem = os.path.join(pathname, item)
        print(indent + newItem)
        traverse(newItem,d+1)
    except:
        pass

虽然我不想使用异常来检测它是否是目录,所以如果允许os.path.isdir

for item in os.listdir(pathname):
    newItem = os.path.join(pathname, item)
    print(indent + newItem)
    if (os.path.isdir(newItem)):
        traverse(newItem,d+1)

答案 1 :(得分:0)

使用os.walk的递归目录打印功能可能如下所示:

def traverse(root, depth, indent=''):
  for file_ in os.listdir(root):
    leaf = os.path.join(root, file_)
    print indent, leaf
    if os.path.isdir(leaf) and depth:
      traverse(leaf, depth-1, indent + '  ')

我不赞成教导人们避免使用内置插件试图将概念推向家庭。有很多方法可以教导递归,而不会让某些人忽略他们正在学习的语言的精细方面。这是我的观点,显然不是许多教授所共有的。