Python编写文件树生成工具

该文章介绍了一个使用Python编写的文件树生成工具,通过递归遍历目录结构,统计文件层级,并能绘制出Markdown格式的文件树。此外,还展示了如何利用PyInstaller将脚本打包成exe可执行文件,以及如何通过注册表编辑在Windows右键菜单中添加快捷方式。
摘要由CSDN通过智能技术生成

使用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可执行脚本

点击这里进行下载

image-20221202211938705

编辑注册表

按住windows + R 输入regedit进入注册表

进入到以下目录:计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\background\shell

shell下新建项GetTree

image-20221202212213337

GetTree下新建项command

image-20221202212302690

修改command的值为

"D:\Program Files\GetFileTree\getTree.exe" "%v."

此时右键文件夹空白处就会有一个GetTree菜单,选中菜单即可运行程序

image-20221202212541504

演示使用效果

cmd命令行

查看所有文件树

输入以下命令,默认查看当前目录文件树,在当前目录下生成一个fileTree.md文件

getTree

image-20221202212732907

查看某个目录的文件树

getTree "D:\学习笔记\Git\OutputFileTree\123123"

image-20221202212921385

查看文件夹树

查看文件夹树,可在最后面加上-d参数

getTree "D:\学习笔记\Git\OutputFileTree\123123" -d

image-20221202213006486

菜单右键生成当前目录的文件树

image-20221202213134128
image-20221202213105334

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值