**pit** = p.iterdir() # 返回一个迭代器,包含p下所有文件夹和文件

判断 p 是不是文件:

print(**p**.is_file())

判断 p 是不是目录:

print(**p**.is_dir())

2.2 代码实现

思路:给出一个路径,判断是否为文件,如果是,则字符串拼接;否则,字符串拼接并且递归查询该目录下的文件。字符串拼接的时候以缩进来显示层次结构。

tree_str = ''

**def** **generate\_tree**(pathname, n=0):
    **global** tree_str
    **if** pathname.is_file():
        tree_str += ' |' * n + '-' * 4 + pathname.name + '\n'
    **elif** pathname.is_dir():
        tree_str += ' |' * n + '-' * 4 + \
            str(pathname.relative_to(pathname.parent)) + '\\' + '\n'
        **for** cp **in** pathname.iterdir():
            generate_tree(cp, n + 1)

**if** __name__ == '\_\_main\_\_':
    generate_tree(Path.cwd())
    print(tree_str)

输出结果:

----PythonApplication\
    |----.ipynb\_checkpoints\
    |    |----01\_generate\_tree-checkpoint.ipynb
    |----01\_generate\_tree.ipynb

2.3 改进,显示指定目录

上述程序有一个缺点,就是执行时只能显示程序文件所在目录的目录树结构,想要生成其目录的目录树结构就需要将其拷贝到那个目录执行。这样很不方便,我们可以利用命令参数将目标路径传递给程序,然后进行显示。上述generate_tree() 不需要修改。执行部分改一下:

**if** __name__ == '\_\_main\_\_':
    # 命令参数个数为2并且目录存在存在
    **if** len(sys.argv) == 2 and Path(sys.argv[1]).exists():
        generate_tree(Path(sys.argv[1]), 0)
    **else**: # 当前路径
        generate_tree(Path.cwd(), 0)
    **print**(tree_str)

修改以后,可以在命令行中添加目录参数了:

**python** dirtree.**py** E:\Programming\Python\applications

执行结果如图所示:

2.4 改进,保存文本文件

以上实现了在控制台打印的功能,但是缺少保存文件的功能,没关系,下面就来实现。

定义保存文件函数:

**def** **save\_file**(tree, filename='tree.txt'):
    **with** open(filename, 'w', encoding='utf-8') **as** f:
        f.write(tree)

修改命令行参数解析部分:

**if** __name__ == '\_\_main\_\_':
        # 命令参数个数为2并且目录存在存在
    **if** len(sys.argv) == 2 and Path(sys.argv[1]).exists():
        generate_tree(Path(sys.argv[1]), 0)
    # 命令参数个数为3并且目录存在存在
    **if** len(sys.argv) == 3 and Path(sys.argv[1]).exists():
        generate_tree(Path(sys.argv[1]), 0)
        save_file(tree_str, sys.argv[2])
    **else**:  # 当前路径
        generate_tree(Path.cwd(), 0)
    **print**(tree_str)

修改完毕之后,可以使用下面命令测试:

**python** dirtree.**py** E:\Programming\Python\applications dirtree.txt

执行完之后就会在该目录下生成 dirtree.txt 文件。

2.5 改进,封装

上述功能已经实现,但是用到了全局变量,既然是一个完整的功能不如封装成一个类。

# -\*- coding: utf-8 -\*-
**import** sys
**from** pathlib **import** Path


**class** **DirectionTree**(object):
    """生成目录树
 @ pathname: 目标目录
 @ filename: 要保存成文件的名称
 """

    **def** **\_\_init\_\_**(self, pathname='.', filename='tree.txt'):
        super(DirectionTree, self).__init__()
        self.pathname = Path(pathname)
        self.filename = filename
        self.tree = ''

    **def** **set\_path**(self, pathname):
        self.pathname = Path(pathname)

    **def** **set\_filename**(self, filename):
        self.filename = filename

    **def** **generate\_tree**(self, n=0):
        **if** self.pathname.is_file():
            self.tree += ' |' * n + '-' * 4 + self.pathname.name + '\n'
        **elif** self.pathname.is_dir():
            self.tree += ' |' * n + '-' * 4 + \
                str(self.pathname.relative_to(self.pathname.parent)) + '\\' + '\n'

            **for** cp **in** self.pathname.iterdir():
                self.pathname = Path(cp)
                self.generate_tree(n + 1)

    **def** **save\_file**(self):
        **with** open(self.filename, 'w', encoding='utf-8') **as** f:
            f.write(self.tree)


**if** __name__ == '\_\_main\_\_':
    dirtree = DirectionTree()
    # 命令参数个数为1,生成当前目录的目录树
    **if** len(sys.argv) == 1:
        dirtree.set_path(Path.cwd())
        dirtree.generate_tree()
        print(dirtree.tree)
    # 命令参数个数为2并且目录存在存在
    **elif** len(sys.argv) == 2 **and** Path(sys.argv[1]).exists():
        dirtree.set_path(sys.argv[1])
        dirtree.generate_tree()
        print(dirtree.tree)
    # 命令参数个数为3并且目录存在存在
    **elif** len(sys.argv) == 3 **and** Path(sys.argv[1]).exists():
        dirtree.set_path(sys.argv[1])
        dirtree.generate_tree()
        dirtree.set_filename(sys.argv[2])
        dirtree.save_file()
    **else**:  # 参数个数太多,无法解析
        print('命令行参数太多,请检查!')

同样可以使用以下三条命令进行测试:

  • python dirtree.py :打印当前目录的目录树;
  • python dirtree.py E:\Programming\Python\applications :打印指定目录的目录树;
  • python dirtree.py E:\Programming\Python\applications dirtree.txt :打印指定目录的目录树并保存成文件。

3、其他想法

本来在改进部分还想要生成图片,但是经过一番测试遇到以下问题: