###############################################################################
# Copyright (C) 2008 - 2020 NONE, Inc. All rights reserved.
###############################################################################
#!/usr/bin/python3
# coding:utf-8
# @author:xxxxxx@qq.com
# @time:2020-04-27 09:44:50
# @file:tree_main.py
import os
import sys
# -d 只显示目录
# -a 显示所有文件
# -L num 显示几层 ,不显示隐藏文件
curent_os = sys.platform
def print_color(color, argv):
if curent_os == "win32":
print(argv)
return
if color == "green":
print("\033[32m", argv, "\033[0m")
elif color == "red":
print("\033[31m", argv, "\033[0m")
elif color == "yellow":
print("\033[33m", argv, "\033[0m")
else:
print(argv)
def parse_option(op_str):
'''
解析参数
'''
# print("option:" + op)
import re
layer_limit = False
layer_max = 0
direct_only = False
show_hidden_file = False
# search layer limit
match_str = format("-L[\s]+\d")
search_ret = re.search(match_str, op_str)
if search_ret is not None:
# print(search_ret.group(0))
layer_limit = True
match_str = format("\d")
search_ret = re.search(match_str, search_ret.group(0))
if search_ret is not None:
# print(search_ret.group(0))
layer_max = int(search_ret.group(0))
# search hidden cfg
match_str = format("-a")
search_ret = re.search(match_str, op_str)
if search_ret is not None:
# print(search_ret.group(0))
show_hidden_file = True
# search direct only
match_str = format("-d")
search_ret = re.search(match_str, op_str)
if search_ret is not None:
# print(search_ret.group(0))
direct_only = True
return show_hidden_file, direct_only, layer_limit, layer_max
def print_side(show_sides):
'''
打印 | 或者 空格
'''
for side in show_sides:
if side:
print("│ " , end="")
else:
print(" " , end="")
def get_files_dirs(dir,show_hidden_file):
'''
传入路径,获取该路径下所有的文件列表,文件夹列表,并且是排序过的
返回值:元组,
第一个元素:文件列表
第二个元素:文件夹列表
'''
file_lst=[] # 存放文件
dir_lst=[] # 存放文件夹
for item in os.scandir(dir):
if not show_hidden_file and item.name[0] == '.':
continue
if item.is_dir():
dir_lst.append(item.name)
elif item.is_file():
file_lst.append(item.name)
# 排序
file_lst.sort()
dir_lst.sort()
return file_lst,dir_lst
def tree_dir(dir, show_hidden_file, direct_only, layer_limit, layer_max,layer=0,show_sides = [True]):
'''
显示目录
参数:
- 查看路径
- 是否隐藏文件
- 是否显示路径
- 是否有层级限制
- 最大层级数量
- show_sides:是否显示 |
'''
file_lst,dir_lst = get_files_dirs(dir,show_hidden_file)
len_of_listdir = len(dir_lst)
len_of_listfile = len(file_lst)
# 显示文件夹
for index,file in enumerate( dir_lst ):
file_path = os.path.join(dir, file)
if layer_limit == True and layer >= layer_max:
continue
print_side(show_sides)
# 继承上级的 show_sides ,准备填充本级目录是否显示 |
curr_show_sides = []
curr_show_sides.extend(show_sides)
if layer >= 0:
if index == len_of_listdir-1: # 显示最后一个路径
if direct_only is not True and len_of_listfile>0:
print("├ ", end="")
curr_show_sides.append(True)
else:
print("└ ", end="")
curr_show_sides.append(False)
else:
print("├ ", end="")
curr_show_sides.append(True)
print_color("green", file)
tree_dir(file_path, show_hidden_file, direct_only, layer_limit, layer_max,layer + 1,curr_show_sides)
# 如果显示文件
if direct_only is not True:
for index,file in enumerate( file_lst):
file_path = os.path.join(dir, file)
if layer_limit == True and layer >= layer_max:
continue
print_side(show_sides)
if layer >= 0:
if index == len_of_listfile and len_of_listdir == 0:
print("└ ", end="") # 显示最后一个文件
else:
if index == len_of_listfile-1:
print("└ ", end="") # 显示最后一个文件
else:
print("├ ", end="")
print(file)
if __name__ == '__main__':
file_name = sys.argv[0]
if len(sys.argv) < 2:
print_color("red", "参数错误!\n")
print("请输入参数:")
print(" 路径,当前路径为 .")
print(" -d 只显示目录")
print(" -a 显示所有文件(.开头的文件)")
print(" -L num 显示几层 ,不显示隐藏文件\n")
sys.exit(1)
path_dir = sys.argv[1]
op = ""
for idx in range(len(sys.argv)):
if idx >= 2:
op += " " + sys.argv[idx]
show_hidden_file, direct_only, layer_limit, layer_max = parse_option(op)
print(show_hidden_file, direct_only, layer_limit, layer_max)
print()
print(path_dir)
tree_dir(path_dir,show_hidden_file, direct_only, layer_limit, layer_max,0,[])
sys.exit(0)
原文出处:/show_1IX8hFhJjWMt.html