**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、其他想法
本来在改进部分还想要生成图片,但是经过一番测试遇到以下问题: