【第二章】桌面文件太乱?Python全自动文件整理术:智能分类,1小时工作秒变1分钟!

回顾上一个章节【第一章】桌面文件太乱?Python全自动文件整理术:批量重命名,1小时工作秒变1分钟,我们牛刀小试了一下。

我们分析了第一个python自动化的程序,实现了在桌面按照日期格式建立一个文件夹。

同时我们写了第二个python程序,将一个文件夹内文件,实现了自定义批量重命名。
在这里插入图片描述

接下来继续我们的全自动文件整理,这篇文章一方面将批量命名剩余功能完善,另一方面开始智能分类。

1.修改为带有日期的文件名:让你的文件自带“生产日期”(按创建/修改日期重命名)

痛点场景: 你有很多扫描件、会议纪要、工作日志,它们的文件名没有日期,或者日期格式不统一。当你想按时间顺序查找时,就非常麻烦。

实现思路: 和之前批量重命名文件类似
1.1 通过输入路径,利用python os 函数,批量读取文件夹文件,形成列表
1.2 对列表进行遍历循环,找到创建时间,如果没有创建时间,找到修改时间,获取时间信息
1.3 在列表中将名字和扩展分开,最后重命名加上时间戳。

具体代码实现:

import os
import datetime

def batch_rename_by_date(folder_path, date_type="modify", date_format="%Y%m%d_"):
    """
    批量重命名指定文件夹下的文件,按创建或修改日期命名。
    :param folder_path: 要处理的文件夹路径
    :param date_type: 日期类型,"create"为创建日期,"modify"为修改日期
    :param date_format: 日期格式,例如 "%Y%m%d_" 生成 "20231027_"
    """
    if not os.path.exists(folder_path):
        print(f"❌ 文件夹不存在:{folder_path}")
        return

    files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
    print(f"🚀 正在批量按日期重命名 '{folder_path}' 下的文件...")

    for filename in files:
        old_path = os.path.join(folder_path, filename)
        
        try:
            # 获取文件时间戳
            if date_type == "create":
                timestamp = os.path.getctime(old_path) # 创建时间
            else: # 默认为 modify
                timestamp = os.path.getmtime(old_path) # 修改时间

            dt_object = datetime.datetime.fromtimestamp(timestamp)
            date_prefix = dt_object.strftime(date_format)

            name, ext = os.path.splitext(filename)
            new_name = f"{date_prefix}{name}{ext}" # 新文件名:日期前缀 + 原文件名 + 扩展名

            new_path = os.path.join(folder_path, new_name)

            # 处理重名:如果新文件名已存在,可以加上一个递增数字或跳过
            counter = 1
            original_new_path = new_path
            while os.path.exists(new_path):
                new_name = f"{date_prefix}{name}({counter}){ext}"
                new_path = os.path.join(folder_path, new_name)
                counter += 1

            os.rename(old_path, new_path)
            print(f"✅ 重命名:'{filename}' -> '{new_name}'")
        except PermissionError:
            print(f"⚠️ 权限不足,无法重命名文件:'{filename}'。请检查文件是否被占用。")
        except Exception as e:
            print(f"❌ 重命名失败:'{filename}'。错误信息:{e}")
    print("✨ 批量按日期重命名完成!")

if __name__ == "__main__":
    # 请修改为你要整理的文件夹路径
    target_folder = os.path.expanduser("~/Desktop/待整理文档")
    batch_rename_by_date(target_folder, date_type="modify", date_format="%Y%m%d_")     

操作步骤

  1. 和之前一样,我们为了简化操作,还是使用 之前文件夹作为演示, D:\旅行
  2. 在这里插入图片描述
    3建立一个新的python文件名字为ModifyFileNameByTime.py,将上面代码粘贴进去。并且修改传入文件夹路径,如下图所示
    在这里插入图片描述
    最后运行结果为:
    在这里插入图片描述
    2.对已有文件名称统一化修改:批量添加、删除、替换特定字符(告别下载前缀,统一命名规范)

痛点场景: 你下载的文件名总是带有各种奇怪的前缀或后缀,比如[下载]_报告.pdf、XXX网站_图片.jpg。或者你的项目文件命名不规范,需要批量替换某个关键词。

实现的思路:
1 同上一个例子相似,显示获取文件列表
2 给出了四种不同修改文件名方案
2.1可以向前插入字符串
2.2 可以向后插入字符串
2.3 可以 删除指定字符串
2.4 可以对字符串进行替换
2.5 可以利用正则表达式自定义替换字符串
3 用户输入指定文件夹啊,需要替换的字符串,程序会自动替换。
代码演示

      import os
import re # 导入正则表达式模块

def batch_rename_by_char_op(folder_path, operation_type="replace", old_str="", new_str="", regex_pattern=None):
    """
    批量重命名文件:添加、删除或替换文件名中的特定字符。
    :param folder_path: 要处理的文件夹路径
    :param operation_type: 操作类型 "add_prefix", "add_suffix", "remove_str", "replace", "regex_replace"
    :param old_str: 待替换的旧字符串(replace, remove_str)
    :param new_str: 替换后的新字符串(replace, add_prefix, add_suffix)
    :param regex_pattern: 正则表达式模式(regex_replace)
    """
    if not os.path.exists(folder_path):
        print(f"❌ 文件夹不存在:{folder_path}")
        return

    files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
    print(f"🚀 正在批量处理 '{folder_path}' 下的文件名字符...")

    for filename in files:
        name, ext = os.path.splitext(filename)
        new_name = name # 初始新名称为原名称部分

        if operation_type == "add_prefix":
            new_name = f"{new_str}{name}"
        elif operation_type == "add_suffix":
            new_name = f"{name}{new_str}"
        elif operation_type == "remove_str":
            new_name = name.replace(old_str, "")
        elif operation_type == "replace":
            new_name = name.replace(old_str, new_str)
        elif operation_type == "regex_replace" and regex_pattern:
            try:
                new_name = re.sub(regex_pattern, new_str, name)
            except re.error as e:
                print(f"❌ 正则表达式错误:{e}")
                continue
        else:
            print("⚠️ 未知的操作类型或缺少参数。")
            continue

        final_new_name = f"{new_name}{ext}"

        old_path = os.path.join(folder_path, filename)
        new_path = os.path.join(folder_path, final_new_name)

        # 处理重名:如果新文件名已存在,添加计数器
        counter = 1
        original_final_new_name = final_new_name
        while os.path.exists(new_path) and new_path != old_path: # 确保不是文件本身
            final_new_name = f"{new_name}({counter}){ext}"
            new_path = os.path.join(folder_path, final_new_name)
            counter += 1

        try:
            os.rename(old_path, new_path)
            print(f"✅ 重命名:'{filename}' -> '{final_new_name}'")
        except PermissionError:
            print(f"⚠️ 权限不足,无法重命名文件:'{filename}'。请检查文件是否被占用。")
        except Exception as e:
            print(f"❌ 重命名失败:'{filename}'。错误信息:{e}")
    print("✨ 批量处理文件名字符完成!")

if __name__ == "__main__":
    target_folder = os.path.expanduser("~/Desktop/下载文件")
    
    # 示例1:移除文件名中的 "[下载]_" 前缀
    # batch_rename_by_char_op(target_folder, operation_type="remove_str", old_str="[下载]_")

    # 示例2:替换文件名中的 "old_version""new_version"
    # batch_rename_by_char_op(target_folder, operation_type="replace", old_str="old_version", new_str="new_version")

    # 示例3:使用正则表达式,移除文件名中所有 "(数字)" 的后缀,如 "报告(1).docx" -> "报告.docx"
    batch_rename_by_char_op(target_folder, operation_type="regex_replace", regex_pattern=r"\(\d+\)", new_str="")

操作步骤:
2.1.和之前一样,我们还是将D:\旅行 作为输入文件夹
2.2 .我们可以新建立一个python文件,名字为ModifyFileNameByCustom.py,将上面的代码粘贴进去
2.3 可以看一下现在的文件夹中文件,我增加了两个右面有数字的
在这里插入图片描述
2.4 我们运行这段程序
2.5 可以看到结果:
在这里插入图片描述
也可看到最终界面结果
在这里插入图片描述程序运行一切正常。

3 智能文件分类:Python自动归档你的图片、文档和视频!

接下来,是Python文件整理的另一大核心功能——文件自动分类。

我们将实现一个智能的图片分类脚本,将你的所有图片自动归类。

同样,针对文档分类,Python也能帮你轻松搞定。

通过编写Python自动整理桌面文件的脚本,你的桌面管理自动化将不再是梦想
核心理念: 我们需要的不仅仅是可以重命名,真正的Python文件整理需要像一个智能管家,根据文件类型、日期、甚至内容,自动把文件扔到对应的“房间”里。

3.1 扩展名魔术:Python帮你秒分“图片”、“文档”、“视频”到指定文件夹!

痛点场景: 你的下载文件夹里,图片、文档、安装包混杂,每次找文件都得滚动很久。

实现的核心思路:

3.1.1我们需要将常见文件扩展名都整理出来,比如jpg,jpeg,gif,mov,mp3,mp4,doc 等等

3.1.2 我们可以像之前一样扫描文件夹,根据文件后缀,就可以知道属于那个类型的文件

3.1.3通过python自动建立对应的目录,将刚才筛选出来的文件放到对应的目录

代码实现:
i

mport os
import shutil # 用于文件移动

def classify_by_extension(source_folder, target_base_folder):
    """
    根据文件扩展名将文件分类移动到指定子文件夹。
    :param source_folder: 源文件夹路径
    :param target_base_folder: 目标根文件夹路径(分类后的子文件夹将在此目录下创建)
    """
    if not os.path.exists(source_folder):
        print(f"❌ 源文件夹不存在:{source_folder}")
        return
    
    # 定义分类规则:扩展名 -> 目标子文件夹名称
    # 你可以根据自己的需要添加或修改
    classify_rules = {
        # 图片
        (".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff"): "Images",
        # 文档
        (".pdf", ".doc", ".docx", ".txt", ".rtf", ".ppt", ".pptx", ".xls", ".xlsx"): "Documents",
        # 视频
        (".mp4", ".mov", ".avi", ".mkv", ".flv"): "Videos",
        # 压缩文件
        (".zip", ".rar", ".7z", ".tar", ".gz"): "Archives",
        # 应用程序/安装包
        (".exe", ".dmg", ".app", ".apk"): "Applications",
        # 其他(可以自行添加)
        (".mp3", ".wav"): "Audio",
        (".py", ".js", ".html", ".css"): "CodeFiles"
    }

    os.makedirs(target_base_folder, exist_ok=True) # 确保目标根文件夹存在

    files = [f for f in os.listdir(source_folder) if os.path.isfile(os.path.join(source_folder, f))]
    print(f"🚀 正在智能分类 '{source_folder}' 下的文件...")

    for filename in files:
        name, ext = os.path.splitext(filename)
        ext = ext.lower() # 将扩展名转为小写,方便匹配

        moved = False
        for extensions, target_subdir_name in classify_rules.items():
            if ext in extensions:
                target_subdir_path = os.path.join(target_base_folder, target_subdir_name)
                os.makedirs(target_subdir_path, exist_ok=True) # 确保子文件夹存在

                source_path = os.path.join(source_folder, filename)
                destination_path = os.path.join(target_subdir_path, filename)

                # 处理重名文件:如果目标位置已存在同名文件,添加递增数字后缀
                base_dest_name, dest_ext = os.path.splitext(destination_path)
                counter = 1
                while os.path.exists(destination_path):
                    destination_path = f"{base_dest_name}({counter}){dest_ext}"
                    counter += 1

                try:
                    shutil.move(source_path, destination_path)
                    print(f"✅ 移动:'{filename}' -> '{target_subdir_name}/'")
                    moved = True
                    break # 文件已移动,跳出内层循环
                except PermissionError:
                    print(f"⚠️ 权限不足,无法移动文件:'{filename}'。")
                    moved = True # 视为已处理,避免后续再次尝试
                    break
                except Exception as e:
                    print(f"❌ 移动失败:'{filename}'。错误信息:{e}")
                    moved = True
                    break
        
        if not moved:
            # 如果文件类型不在规则中,可以移动到“Others”文件夹
            other_folder = os.path.join(target_base_folder, "Others")
            os.makedirs(other_folder, exist_ok=True)
            try:
                shutil.move(os.path.join(source_folder, filename), os.path.join(other_folder, filename))
                print(f"➡️ 移动到 Others:'{filename}'")
            except Exception as e:
                print(f"❌ 移动到 Others 失败:'{filename}'。错误信息:{e}")

    print("✨ 文件智能分类完成!")

if __name__ == "__main__":
    source_dir = os.path.expanduser("~/Desktop/混乱文件") # 你的混乱文件目录
    target_dir = os.path.expanduser("~/Documents/整理后文件") # 整理后的目标目录
    
    # 确保源文件夹有测试文件,目标文件夹可以为空或不存在
    # 建议手动创建一些混合类型的文件到 source_dir 进行测试
    
    classify_by_extension(source_dir, target_dir)

实现步骤:
1创建文件ArrangeFile.py,粘贴上面代码
在这里插入图片描述

2建立一个混乱文件夹,包含音频,视频,文档,图片等
在这里插入图片描述

3建立一个整理后文件夹
4 执行运行

注意问题: 直接用D:\旅行\before,有可能报错,因为\b 是转义,需要修改为D:\旅行\before

效果展示
在这里插入图片描述

4 进阶分类:当文件没有扩展名怎么办?Python如何识别!

痛点场景: 有时候下载的文件没有扩展名(如某些网络缓存文件、Linux下传输的文件),或者你想

根据文件内容而非文件名来分类(比如识别一张图片是不是PNG,即使它没有.png后缀)。

工作原理:

其实我们可以通过python-magic 库 来识别文件头。换句话说,每个文件都有一个魔术头,只不过,肉眼但不到,需要通过解析文件内容,在二进制中会有一些特征。只要我们提取得到这些魔术头的特征,进行匹配就可以了。

4.1 我们依然是通过os来解析文件夹下面的文件
4.2 我们安装python-magic,集成到我们python环境中
4.3遍历循环,读取文件和魔术头对比
4.4 最终分类,让不同文件放置到不同目录。

演示代码:

import os
import shutil
import magic # 导入 python-magic 库

# 确保你已经安装了 python-magic 库:pip install python-magic-bin (Windows) 或 pip install python-magic (Linux/macOS)

def classify_by_magic(source_folder, target_base_folder):
    """
    使用 python-magic 库识别文件类型并分类。
    :param source_folder: 源文件夹路径
    :param target_base_folder: 目标根文件夹路径
    """
    if not os.path.exists(source_folder):
        print(f"❌ 源文件夹不存在:{source_folder}")
        return

    os.makedirs(target_base_folder, exist_ok=True)
    
    files = [f for f in os.listdir(source_folder) if os.path.isfile(os.path.join(source_folder, f))]
    print(f"🚀 正在使用文件魔术识别并分类 '{source_folder}' 下的文件...")

    for filename in files:
        source_path = os.path.join(source_folder, filename)
        
        try:
            # 使用 python-magic 识别文件MIME类型
            # 注意:在某些系统上,可能需要额外安装libmagic库
            file_mime_type = magic.from_file(source_path, mime=True)
            
            # 根据MIME类型映射到分类文件夹名称
            # 你可以根据需要扩展这个映射表
            target_subdir_name = "Others" # 默认分类
            if file_mime_type.startswith("image/"):
                target_subdir_name = "Images"
            elif file_mime_type.startswith("application/pdf"):
                target_subdir_name = "Documents/PDF"
            elif file_mime_type.startswith("application/msword") or \
                 file_mime_type.startswith("application/vnd.openxmlformats-officedocument.wordprocessingml"):
                target_subdir_name = "Documents/Word"
            elif file_mime_type.startswith("application/vnd.ms-excel") or \
                 file_mime_type.startswith("application/vnd.openxmlformats-officedocument.spreadsheetml"):
                target_subdir_name = "Documents/Excel"
            elif file_mime_type.startswith("video/"):
                target_subdir_name = "Videos"
            elif file_mime_type.startswith("text/"):
                target_subdir_name = "Texts"
            elif file_mime_type.startswith("application/zip") or \
                 file_mime_type.startswith("application/x-rar"):
                target_subdir_name = "Archives"

            target_subdir_path = os.path.join(target_base_folder, target_subdir_name)
            os.makedirs(target_subdir_path, exist_ok=True)

            destination_path = os.path.join(target_subdir_path, filename)
            
            # 处理重名
            base_dest_name, dest_ext = os.path.splitext(destination_path)
            counter = 1
            while os.path.exists(destination_path):
                destination_path = f"{base_dest_name}({counter}){dest_ext}"
                counter += 1

            shutil.move(source_path, destination_path)
            print(f"✅ 移动:'{filename}' -> '{target_subdir_name}/' (识别为: {file_mime_type})")

        except magic.MagicException as e:
            print(f"❌ 识别文件类型失败:'{filename}'。错误信息:{e}")
            # 可以选择移动到 Unknown 文件夹
            unknown_folder = os.path.join(target_base_folder, "Unknown")
            os.makedirs(unknown_folder, exist_ok=True)
            try:
                shutil.move(source_path, os.path.join(unknown_folder, filename))
                print(f"➡️ 移动到 Unknown:'{filename}'")
            except Exception as e_move:
                print(f"❌ 移动到 Unknown 失败:'{filename}'。错误信息:{e_move}")
        except PermissionError:
            print(f"⚠️ 权限不足,无法移动文件:'{filename}'。")
        except Exception as e:
            print(f"❌ 移动失败:'{filename}'。错误信息:{e}")
    print("✨ 文件魔术识别分类完成!")

if __name__ == "__main__":
    source_dir = os.path.expanduser("~/Desktop/无名文件") # 你的无名文件目录
    target_dir = os.path.expanduser("~/Documents/魔术识别整理") # 整理后的目录
    
    # 建议手动创建一些没有扩展名但内容是图片/文档的文件,或者将现有文件扩展名删除进行测试。
    # 例如:创建一个文本文档,保存为“测试文件”,然后删除其.txt扩展名。
    
    classify_by_magic(source_dir, target_dir)   

操作步骤
4.1 建立一个py文件,我们将它命名为MagicFile.py
在这里插入图片描述

4.2 需要导入magic ,我这里使用了pip install python-magic-bin pip install python-magic,两个都要安装在这里插入图片描述

4.4 建立一个目录D:\旅行\magic ,同时将之前数据copy,去除后缀
在这里插入图片描述
4.5运行程序

4.6 最终结果在这里插入图片描述现在,你不再需要手动拖拽、一个一个改名,你只需要轻轻一点,就能让1小时的文件整理工作缩短到1分钟,把宝贵的时间留给自己!

总结一下我们都做了哪些事情。

1 我们完成了对于文件夹文件,进行批量日期添加
2 对于下载或者重名文件,我们进行了文件名批量字符串替换
3 我们还对文件夹中文件进行了识别,根据后缀名字,分门别类的放置到对应目录。
4 针对没有文件扩展名的特殊情况,我们第一次引入了python-magic 根据文件内容进行识别

包含了源代码,截图,运行流程,代码中注意点,以及运行结果,我们进行了详细的演示。

同时我会将用到的文件进行打包上传。

喜欢这个主题的,可以进行关注,点赞和收藏,

到此结束了吗?

还远远不够,不能每次都点开vscode,每次都在修改代码? 这也太不方便了吧!

下一个章节,我会继续封装前面的功能,并亲手打造了一个高效的文件整理神器。期待您的关注。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值