python自动整理文件,就这么简单

平时工作没有养成分类的习惯,整个桌面杂乱无章都是文档和资料,几乎快占满整个屏幕了。所以必须要整理一下了,今天我们来看下用python如何批量将不同后缀的文件移动到同一文件夹。

演示效果:

  • 使用前
    在这里插入图片描述

  • 使用后在这里插入图片描述

代码:

# # -*- coding:utf-8 -*-
import os
import glob
import shutil
import tkinter
import tkinter.filedialog
import filecmp
from datetime import datetime



def start():
    """
    tkinter弹出窗口获取文件路径path。
    """
    root = tkinter.Tk()
    root.withdraw()
    dirname = tkinter.filedialog.askdirectory(
        parent=root, initialdir="/", title='请选择文件夹')
    return dirname
def check_repeat_file(path):
    """
    去掉重复文件
    """
    dir_path = path
    file_lst = []
    file_count = 0
    for i in glob.glob(dir_path + '/**/*', recursive=True):
        if os.path.isfile(i):
            file_lst.append(i)
            file_count += 1
    print("\n检查文件计数:%d" % file_count, end='')

    for x in file_lst:
        for y in file_lst:
            if x != y and os.path.exists(x) and os.path.exists(y):
                if filecmp.cmp(x, y):
                    os.remove(y)
                    print('\n移除重复文件:%d'%y)





def JudgeFile(suffix):
    """
    定义一个函数,传入每个文件对应的后缀。判断文件是否存在于字典file_dict中;
    如果存在,返回对应的文件夹名;如果不存在,将该文件夹命名为"未知分类";
    定义一个文件字典,不同的文件类型,属于不同的文件夹
    """
    file_dict = {
        "图片": ["jpeg", "jpg", "tiff", "gif", "bmp", "png", "bpg", "svg", "heif", "psd"],
        "视频": ["avi", "flv", "wmv", "mov", "mp4", "webm", "vob", "mng", "qt", "mpg", "mpeg", "3gp", "mkv"],
        "音频": ["aac", "aa", "aac", "dvf", "m4a", "m4b", "m4p", "mp3", "msv", "ogg", "oga", "raw", "vox", "wav", "wma"],
        "文档": ["oxps", "epub", "pages", "docx", "doc", "fdf", "ods", "odt", "pwi", "xsn", "xps", "dotx", "docm", "dox",
               "rvg", "rtf", "rtfd", "wpd", "xls", "xlsx", "xlsm", "ppt", "pptx", "csv", "pdf", "md", "xmind"],
        "压缩文件": ["a", "ar", "cpio", "iso", "tar", "gz", "rz", "7z", "dmg", "rar", "xar", "zip"],
        "文本": ["txt", "in", "out", "json", "xml", "log"],
        "程序脚本": ["py", "html5", "html", "htm", "xhtml", "cpp", "java", "css", "sql"],
        '可执行程序': ['exe', 'bat', 'lnk', 'sys', 'com', 'apk'],
        '字体文件': ['eot', 'otf', 'fon', 'font', 'ttf', 'ttc', 'woff', 'woff2', 'shx'],
        '工程图文件': ['bak', 'dwg', 'dxf', 'dwl', 'dwl2', 'stp', 'SLDPRT', 'ipj', 'ipt', 'idw']
    }
    for name, type_list in file_dict.items():
        if suffix.lower() in type_list:
            return name
    return "未知分类"



def deldir(path):
    """
    清理空文件夹和空文件
    path: 文件路径,检查此文件路径下的子文件
    """
    try:
        files = os.listdir(path)  # 获取路径下的子文件(夹)列表
        for file in files:
#             print('遍历路径:'+os.fspath(path + '/' + file))
            if os.path.isdir(os.fspath(path+'/'+file)):  # 如果是文件夹
                if not os.listdir(os.fspath(path+'/'+file)):  # 如果子文件为空
                    print(file+'是空文件夹,即将执行删除操作')
                    os.rmdir(os.fspath(path+'/'+file))  # 删除这个空文件夹
                else:
#                     print(file+'不是空文件夹')
                    deldir(os.fspath(path+'/'+file))  # 遍历子文件
                    if not os.listdir(os.fspath(path+'/'+file)):  # 如果子文件为空
                        print(file+'是空文件夹,即将执行删除操作')
                        os.rmdir(os.fspath(path+'/'+file))  # 删除这个空文件夹
            elif os.path.isfile(os.fspath(path+'/'+file)):  # 如果是文件
                if os.path.getsize(os.fspath(path+'/'+file)) == 0:  # 文件大小为0
                    print(file+'是空文件,即将执行删除操作!')
                    os.remove(os.fspath(path+'/'+file))  # 删除这个文件
        return
    except FileNotFoundError:
        print("\n文件夹路径错误")


def main():
    """
    主函数,根据文件后缀整理文件
    path: 文件路径,检查此文件路径下的子文件
    """
    try:
        path = start()
        print("路径是:\n ", path)
        check_repeat_file(path)
        if path == "":
            print("没有选择路径!")
        # 递归获取 "待处理文件路径" 下的所有文件和文件夹。
     
        for file in glob.glob(f"{path}/**/*", recursive=True):
            # 由于我们是对文件分类,这里需要挑选出文件来。
            if os.path.isfile(file):
                # 由于isfile()函数,获取的是每个文件的全路径。这里再调用basename()函数,直接获取文件名;
                file_name = os.path.basename(file)
                suffix = file_name.split(".")[-1]
                # 判断 "文件名" 是否在字典中。
                name = JudgeFile(suffix)
                # 根据每个文件分类,创建各自对应的文件夹。
                if not os.path.exists(f"{path}\\{name}"):
                    os.mkdir(f"{path}\\{name}")
                    print('path-->', name)
                # 将文件复制到各自对应的文件夹中。
                # shutil.copy(file, f"{path}\\{name}")
                # 将文件移动到各自对应的文件夹中。
                shutil.move(file, f"{path}\\{name}")
        deldir(path)
        print("\n已经整理完成。")
    except BaseException:
        print('\n出现未知错误!')
        

if __name__ == '__main__':
    main()

执行起来很简单,只要写完程序,点击程运行,等待弹出窗口,选择需要整理的文件夹即可。

如果觉得以上代码觉得复杂,可以尝试以下更为简单的程序。

# 如何实现文件自动分类?
# 同一目录下存在很多不同类型的资源条件
# 1.分类
# 2.创建分类目录
# 3.移动文件资源

import os
import shutil
import tkinter
import tkinter.filedialog
from datetime import datetime

def start():
    root = tkinter.Tk()
    root.withdraw()
    dirname = tkinter.filedialog.askdirectory(parent=root,initialdir="/",title='请选择文件夹')
    return dirname

# 源文件存在路径
src_dir=start()
# 分类资源存在路径
dest_dir=src_dir
# 判断目录是否存在
if not os.path.exists(dest_dir):
    os.mkdir(dest_dir)
# 源目录分析
files=os.listdir(src_dir)
for item in files:
    src_path=os.path.join(src_dir,item)
    # 判断状态
    if os.path.isfile(src_path):
        #如果是文件,进入代码块
        # 判断文件资源的类型
        ndir = item.split('.')[-1]
        desc_path=os.path.join(dest_dir,ndir)
        # 创建分类目录
        if not os.path.exists(desc_path):
            # 如果分类子目录不存在,创建
            os.mkdir(desc_path)
        shutil.move(src_path,desc_path)
  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值