六十来行python代码完成一个文件分类器

2020-07-14 17:52:29 浏览数 (2)

你的桌面是否像这样的一样被各种文件给堆满了,但是每一个文件又不清楚是否后面还有作用,也不敢删除,自己一个一个转移又太麻烦了。没关系,今天我带大家用python一起来做一个文件归类器,一键进行分类,再也不会看到满满当当的桌面了。

我们今天需要导入的os、shutil、glob这三个库,os用来对路径的处理,shutil用来对文件的拷贝删除处理,glob用来对指定文件夹下的文件进行遍历。

代码语言:javascript复制
# -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
import os
import shutil
import glo

参数获取程序

然后我们写了一个参数获取函数,用于处理需要文件进行分类的路径和存放路径等参数的用户输入。

代码语言:javascript复制
# -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
def getconf():
    flag = "1"
    print("输入‘1’为桌面文件夹整理,其它文件夹整理请输入完整路径")
    path=input("请输入需要整理的文件夹:")
    if path=="1":
        goal_path = os.path.join(os.path.expanduser('~'), "Desktop")
    else:
        goal_path = path
        flag = input("是否需要保留原文件(此项配置仅针对非桌面文件夹有效),保留请输入‘1’,不保留请输入‘2’:")
    mkdir_path=input("请输入整理后的文件存放路径:")
    if not os.path.exists(mkdir_path):
        os.mkdir(mkdir_path)
    return goal_path,mkdir_path,flag

文件处理程序

因为桌面文件夹和普通文件夹不一样,桌面文件上存在着大量的可执行程序和快捷方式,我们无需将这一部分的文件进行归类处理。所以我这里将桌面文件夹和普通文件夹分开进行了处理。我们先看看普通文件夹的处理方式。

代码语言:javascript复制
# -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
def FileHandle(goal_path,mkdir_path,flag):
    file_num = 0
    path_num = 0

    for file in glob.glob(f'{goal_path}/**/*', recursive=True):
        if os.path.isfile(file):
            filename = os.path.basename(file)
            if '.' in filename:
                suffix = filename.split('.')[-1]
            else:
                suffix = 'others'
            if not os.path.exists(f'{mkdir_path}/{suffix}'):
                os.mkdir(f'{mkdir_path}/{suffix}')
                path_num  = 1
            shutil.copy(file, f'{mkdir_path}/{suffix}')
            file_num  = 1
    if flag=="2":
        shutil.rmtree(goal_path)
    return file_num,path_num

在对普通文件夹处理之后我们根据输入的flag参数判断是否需要保留原文件,若不需保留的话,我们就删除目标文件夹及其下属的所有文件内容。

代码语言:javascript复制
# -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
    if flag=="2":
        shutil.rmtree(goal_path)

我们再看看桌面文件的处理方式

代码语言:javascript复制
# -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
def DesktopHandle(goal_path,mkdir_path):
    file_num = 0
    path_num = 0
    for file in glob.glob(f'{goal_path}/**/*', recursive=True):
        if os.path.isfile(file):
            filename = os.path.basename(file)
            if '.' in filename:
                suffix = filename.split('.')[-1]
            else:
                suffix = 'others'
            if suffix=="exe" or suffix=="lnk":
                pass
            else:
                if not os.path.exists(f'{mkdir_path}/{suffix}'):
                    os.mkdir(f'{mkdir_path}/{suffix}')
                    path_num  = 1
                shutil.copy(file, f'{mkdir_path}/{suffix}')
            file_num  = 1
    return file_num,path_num

大体思路和普通文件夹的处理是一致的,但是在桌面文件的处理中我们将exe和lnk后缀的文件进行了过滤,不对它进行拷贝操作,其它文件我们都拷贝到目标文件夹中。

代码语言:javascript复制
 # -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
 if suffix=="exe" or suffix=="lnk":
                pass
            else:
                if not os.path.exists(f'{mkdir_path}/{suffix}'):
                    os.mkdir(f'{mkdir_path}/{suffix}')
                    path_num  = 1
                shutil.copy(file, f'{mkdir_path}/{suffix}')

另外在桌面文件的处理中我现在也没有放上删除原文件的操作,若有需要的小伙伴直接在后面加上文件删除操作即可。

统计信息程序

在所有的文件都处理之后,我还弄了一个统计程序,统计一共处理了多少个文件,创建了多少个分类文件夹。

代码语言:javascript复制
# -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
def WriteInfo(mkdir_path):
    file_name = mkdir_path "info.txt"
    with open(file_name,'w',encoding='utf-8') as f:
        f.write(f'整理完成,有{file_num}个文件分类到了{path_num}个文件夹中')

主程序

最后就是我们的主程序了,分别去调用参数获取程序,文件处理程序和统计程序即可。

代码语言:javascript复制
# -*- coding:utf-8 -*-
#author:菜鸟小白的学习分享
if __name__ == '__main__':
    goal_path,mkdir_path,flag=getconf()
    if goal_path==os.path.join(os.path.expanduser('~'), "Desktop"):
        file_num,path_num=DesktopHandle(goal_path, mkdir_path)
    else:
        file_num,path_num=FileHandle(goal_path, mkdir_path,flag)
    WriteInfo(mkdir_path)

实现效果

好了,整个程序都分析过了,最后我们看看最终的实现效果吧。

程序的执行是这样的

桌面文件的归类

普通文件的归类

结束

有需要程序源码的小伙伴关注公众号“菜鸟小白的学习分享”回复“文件分类器源码”即可获取源码下载链接。

有需要程序执行文件的小伙伴关注公众号“菜鸟小白的学习分享”回复“文件分类器可执行文件”即可获取菜鸟小白打包好的可执行程序下载链接。

0 人点赞