Python中的文件目录递归打印

1 投票
2 回答
1965 浏览
提问于 2025-04-17 22:20

我正在尝试找出如何以合适的缩进打印出目录中的每个项目。到目前为止,我的代码如下:

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打印出文件名时,它都会重复文件夹的名字,因为这在一个循环里。任何小提示都会非常感谢!

2 个回答

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 + '  ')

我不太赞成教人们避开内置函数来强调某个概念。其实有很多方法可以教递归,而不需要让人忽视他们正在学习的语言中的一些细节。不过这只是我的看法,显然并不是很多教授的想法。

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)

撰写回答