使用Python编写文件树生成工具
编写Python代码
代码部分编写较为复杂,请自行解读
import os
import sys
class GetDirTree:
def __init__(self, directory='.', only_dir=False):
self.directory = os.path._getfullpathname(directory)
self.part_directory = '\\'.join(self.directory.split('\\')[:-1])
self.path = [self.directory.split('\\')[-1]]
self.only_dir = only_dir
self.path_num = {}
# 递归获取所有的文件及文件夹
def __loop(self, dir_):
tmp_path = self.listdir(dir_)
for i in tmp_path:
tmp = os.path.join(dir_, i)
self.path.append(tmp.replace(self.part_directory + '\\', ''))
if os.path.isdir(tmp):
self.__loop(tmp)
# 对文件夹的层级进行计数
def __get_num(self):
for i in self.path:
self.path_num[i] = len(i.split('\\'))
def run(self):
self.__loop(self.directory) # 生成文件列表
self.__get_num() # 统计文件层级
self.plot_tree() # 绘制文件树
return self.path_num
# 按照文件在前,文件夹在后的顺序排列
def listdir(self, dir_):
tmp = os.listdir(dir_)
all_dir = [i for i in tmp if os.path.isdir(os.path.join(dir_, i)) and i[0] != '.']
all_file = [i for i in tmp if not os.path.isdir(os.path.join(dir_, i)) and i[0] != '.']
if self.only_dir:
return all_dir
else:
return all_file + all_dir
@staticmethod
def __get_special(list_):
res = {}
res2 = []
for i in range(len(list_)):
if i == len(list_) - 1:
# 将最后一行加入
tmp_index = len(list_) - 1
tmp = list_[tmp_index]
while True:
if list_[tmp_index] == tmp:
res[tmp_index] = 1
tmp_index -= 1
else:
res2.append(tmp_index)
break
elif list_[i] - list_[i + 1] > 1:
tmp_index = i
tmp = list_[i]
while True:
if list_[tmp_index] == tmp:
res[tmp_index] = list_[i] - list_[i + 1] + 1
tmp_index -= 1
else:
res2.append(tmp_index)
break
return res, res2
# 绘制文档
def plot_tree(self, filename='fileTree.md'):
# 文件存在就删除
if os.path.exists(filename):
os.remove(filename)
print(f'Total {len(self.path_num)} files.')
names = list(self.path_num.keys())
nums = list(self.path_num.values())
special_num, special_num2 = self.__get_special(nums)
strings = []
strings.append(names[0].split('\\')[-1] + '\n') # 第一行
for i in range(1, len(nums)):
end_string = names[i].split('\\')[-1] + '\n'
if i == len(nums) - 1 or (nums[i - 1] <= nums[i] and nums[i + 1] < nums[i]):
string = ' │ ' * (nums[i] - 2) + ' └─' + end_string
else:
string = ' │ ' * (nums[i] - 2) + ' ├─' + end_string
if i in special_num.keys():
string = string[::-1].replace('│', ' ', special_num[i] - 2)[::-1]
if i in special_num2:
string = string.replace('├─', '└─')
strings.append(string)
for index in list(range(len(strings)))[::-1]:
for n in range(max(nums)):
check_index = 2 + n * 4
try:
# 处理三种特殊情况
if strings[index][check_index] == ' ' and strings[index - 1][check_index] == '│':
tmp_list = list(strings[index - 1])
tmp_list[check_index] = ' '
strings[index - 1] = ''.join(tmp_list)
elif strings[index][check_index] == ' ' and strings[index - 1][check_index] == '├':
tmp_list = list(strings[index - 1])
tmp_list[check_index] = '└'
tmp_list[check_index + 1] = '─'
strings[index - 1] = ''.join(tmp_list)
elif strings[index][check_index] == '├' and strings[index + 1][check_index] not in ['├', ' ', '│', '└']:
tmp_list = list(strings[index])
tmp_list[check_index] = '└'
strings[index] = ''.join(tmp_list)
except:
...
[print(str_)for str_ in strings]
with open(filename, 'a', encoding='utf-8') as f:
f.writelines(strings)
if __name__ == '__main__':
input_ = sys.argv
if len(input_) == 1:
get_dir = GetDirTree()
get_dir.run()
elif len(input_) == 2:
get_dir = GetDirTree(sys.argv[1])
get_dir.run()
elif len(input_) == 3:
if '-d' in sys.argv:
sys.argv.remove('-d')
get_dir = GetDirTree(sys.argv[1], only_dir=True)
get_dir.run()
else:
print(f'''Input Error, if you only want to get directory tree.
Please use (python *.py d directory)! Not (python {" ".join(sys.argv)})''')
打包成exe工具
下载pyinstaller
pip install pyinstaller
打包
pyinstaller -F -w getTree.py
输入以上命令实现打包
在当前目录下会自动生成一个dist
文件夹,文件夹中就有一个getTree.exe
可执行脚本
编辑注册表
按住windows + R
输入regedit
进入注册表
进入到以下目录:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell
在shell
下新建项GetTree
在GetTree
下新建项command
修改command
的值为
"D:\Program Files\GetFileTree\getTree.exe" "%v."
此时右键文件夹空白处就会有一个GetTree
菜单,选中菜单即可运行程序
演示使用效果
cmd命令行
查看所有文件树
输入以下命令,默认查看当前目录文件树,在当前目录下生成一个fileTree.md
文件
getTree
查看某个目录的文件树
getTree "D:\学习笔记\Git\OutputFileTree\123123"
查看文件夹树
查看文件夹树,可在最后面加上-d
参数
getTree "D:\学习笔记\Git\OutputFileTree\123123" -d
菜单右键生成当前目录的文件树