背景
- 最近本菜鸡在学习 linux 操作,然后依稀记得好像有个 tree 命令,能够显示所给路径的 DOM树 结构,但出了意外
- 竟然还要下载???我这初学者一脸懵。
- 那既然如此,还不如自己写一个呢,还是那句话:
过程
所需要的库及函数说明
argparse
- 既然是要在命令行中执行,那么就需要解析命令行输入的参数,于是,经过挑选,我最后选择了 argparse 这个库
- 官方文档中对这个库的说明如下:
argparse 模块可以让人轻松编写用户友好的命令行接口。
程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。
argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
- 我主要用了一些基本的函数
parser = argparse.ArgumentParser()
创建解析参数的对象
parser.add_argument()
添加选项和各种参数name,指明参数名
choices,对应参数的值所对应的有限个选项
help,解释该参数的作用
default,设置默认值
dest,这个有点不太好理解,算是给这个参数起个别名,取值的时候较为容易eg: dest=“f_path”
取值时就是 parser.f_path
parser.parser_args()
解析命令行
os
- os 库是一个很好用的进行系统操作的库
- sys 也很好用,但这次我就使用了 os 库
- 我使用的函数
os.listdir(path)
得到所给路径中所有文件及文件夹名称,返回一个列表
os.path.join(path1, path2)
将两个路径进行拼接,返回一个字符串
os.path.isfile(path)
判断所给路径是否为文件
思路
- 首先, 解析命令行参数,获取要分析的路径
- 我给出的参数
- -f,指定路径
- -c,指定显示在文件名称前的字符,三个选项(可根据自己喜好修改)
def parse_jie():
parser = argparse.ArgumentParser(usage='python tree [option] [value]')
parser.add_argument('-f', default='', help='file_path', dest='f_path')
parser.add_argument('-c', default='>', choices=['>', '-', '*'], dest='char')
args = parser.parse_args()
r_dict = {
'f_path' : args.f_path,
'char' : args.char
}
return r_dict
- 其次, 使用递归获得所给路径中所有的文件,并保存到一个大的字典中
def get_file_list(base_path, path = ''):
result_dict = {}
if path == '':
l_path = base_path
else:
l_path = path
result_dict[l_path] = []
f_list = os.listdir(os.path.join(base_path, path))
for file in f_list:
f_path = os.path.join(base_path, l_path, file)
if os.path.isdir(f_path):
result_dict[l_path].append(get_file_list(os.path.join(base_path, l_path), file))
else:
result_dict[l_path].append(file)
return result_dict
- 然后, 按照层次关系输出文件 DOM 树结构
def print_tree(r_dict, char = '|>'):
for key in r_dict.keys():
print(key)
for file in r_dict[key]:
if type(file) == str:
print('|\t' + char, '文件:', file)
else:
print('|\t' + char, '文件夹:', end='')
print_tree(file, '|\t' + char)
- 整体代码如下:
# -*- coding=utf-8 -*-
import os
import argparse
def parse_jie():
parser = argparse.ArgumentParser(usage='python tree [option] [value]')
parser.add_argument('-f', default='', help='file_path', dest='f_path')
parser.add_argument('-c', default='>', choices=['>', '-', '*'], dest='char')
args = parser.parse_args()
r_dict = {
'f_path' : args.f_path,
'char' : args.char
}
return r_dict
def get_file_list(base_path, path = ''):
result_dict = {}
if path == '':
l_path = base_path
else:
l_path = path
result_dict[l_path] = []
f_list = os.listdir(os.path.join(base_path, path))
for file in f_list:
f_path = os.path.join(base_path, l_path, file)
if os.path.isdir(f_path):
result_dict[l_path].append(get_file_list(os.path.join(base_path, l_path), file))
else:
result_dict[l_path].append(file)
return result_dict
def print_tree(r_dict, char = '|>'):
for key in r_dict.keys():
print(key)
for file in r_dict[key]:
if type(file) == str:
print('|\t' + char, '文件:', file)
else:
print('|\t' + char, '文件夹:', end='')
print_tree(file, '|\t' + char)
args = parse_jie()
print_tree(get_file_list(args.get('f_path')), '|' + args.get('char'))
- 最后,也算是比较重要的,就是 将 tree.py 文件加入到环境变量中 ,这样,我们可以 在任何路径下都可以直接运行 tree.py 文件了。
- 设置环境变量的方法请见链接
- 设置如下图所示
最后效果
-
未指定字符
-
指定字符
-
是不是看起来还不错,(●’◡’●)
不足
- 选项少,未来想加入两个选项, maxdepth 和 mindepth ,最大遍历深度和最小遍历深度。
- 外观还有待改善,想做成 tree 那种
- 下一步我用 pyinstaller 将程序打包,将打包好的程序加入环境变量中,就不用再 python tree.py 了
结尾
以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。