python 实现 linux tree

背景

  • 最近本菜鸡在学习 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 了



结尾

以上就是我要分享的内容,因为学识尚浅,会有不足,还请各位大佬指正。
有什么问题也可在评论区留言。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值