10 分钟搞定 Python 文件批量管理工具:自动分类、重命名、查找,从此告别文件夹混乱(附完整源码)
作为打工人 / 学生党,你是否也被这些问题困扰?—— 电脑里的文件堆成 “垃圾山”,照片、文档、安装包混在一个文件夹;想找上个月的报告,翻了 10 分钟才定位到;下载的资料命名乱七八糟,“新建文档 1.docx”“最终版_改 2.pdf” 占满屏幕……
今天教大家用 Python 开发一款文件批量管理工具,一次性解决 “分类、重命名、查找” 三大痛点。全程仅需基础语法 + 1 个内置库,新手也能跟着做,最后还会教你如何双击运行工具,彻底解放双手!
一、项目为什么值得学?(3 个核心价值)
- 刚需性强:无论工作还是学习,每个人都需要整理文件,学会后当天就能用,帮你节省 80% 的整理时间
- 技术门槛极低:只用 Python 自带的
os库(无需额外安装),核心代码不到 100 行,适合 Python 入门 1 周以上的新手练手 - 可扩展性高:基础功能实现后,还能轻松添加 “自动压缩”“文件加密”“定时整理” 等进阶功能,放在简历 / 作品集里超加分
二、准备工作:3 分钟完成环境搭建
本项目无需安装任何第三方库,Python 自带的os库就能实现所有功能(os库是 Python 内置的文件 / 目录操作模块,无需pip install)。
确认环境
- 打开电脑的 CMD(Windows)或终端(Mac),输入
python --version,确保 Python 版本在 3.6 以上(目前主流版本都满足) - 新建一个文件夹,命名为 “Python 文件管理工具”,用于存放代码和测试文件
- 在该文件夹中新建 2 个文件:
file_manager.py:存放工具代码测试文件夹:用于存放各种类型的测试文件(如图片、文档、视频等,方便后续测试功能)
三、功能 1:文件自动分类 —— 按类型整理混乱文件夹
需求场景
假设 “测试文件夹” 里混杂了各种类型的文件:.jpg图片、.docx文档、.pdf资料、.mp4视频、.exe安装包…… 我们需要让工具自动按文件类型创建文件夹,并将对应文件移动到指定文件夹中,最终效果如下:
plaintext
测试文件夹/
├─ 图片文件/(存放.jpg/.png/.gif等)
├─ 文档文件/(存放.docx/.pdf/.txt等)
├─ 视频文件/(存放.mp4/.avi等)
├─ 安装包/(存放.exe/.dmg等)
└─ 其他文件/(存放未匹配到类型的文件)
核心思路
- 定义 “文件类型 - 文件夹名称” 的对应关系(比如
.jpg对应 “图片文件”) - 遍历目标文件夹中的所有文件(跳过子文件夹)
- 对每个文件,根据后缀名判断其类型,找到对应的目标文件夹
- 若目标文件夹不存在,则自动创建;若已存在,直接将文件移动过去
完整代码(带详细注释)
import os
import shutil # 用于移动文件
def auto_classify_files(target_folder):
"""
按文件类型自动分类文件
:param target_folder: 目标文件夹路径(需要整理的文件夹)
"""
# 1. 定义文件类型与目标文件夹的映射关系(可根据自己需求扩展)
file_type_map = {
# 图片类型
"图片文件": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff"],
# 文档类型
"文档文件": [".docx", ".doc", ".pdf", ".txt", ".xlsx", ".xls", ".ppt", ".pptx"],
# 视频类型
"视频文件": [".mp4", ".avi", ".mov", ".mkv", ".flv"],
# 音频类型
"音频文件": [".mp3", ".wav", ".flac", ".m4a"],
# 安装包/压缩包
"安装包与压缩包": [".exe", ".dmg", ".zip", ".rar", ".7z"],
# 代码文件
"代码文件": [".py", ".java", ".cpp", ".html", ".css", ".js"]
}
# 2. 遍历目标文件夹中的所有内容(文件和子文件夹)
for file_name in os.listdir(target_folder):
# 拼接完整的文件路径
file_path = os.path.join(target_folder, file_name)
# 跳过子文件夹,只处理文件
if os.path.isdir(file_path):
continue
# 3. 获取文件的后缀名(如".jpg"),并转换为小写(避免大小写问题,如".JPG"和".jpg"统一处理)
file_ext = os.path.splitext(file_name)[1].lower()
# 4. 标记文件是否已分类(默认未分类)
classified = False
# 5. 遍历文件类型映射,找到对应的目标文件夹
for folder_name, ext_list in file_type_map.items():
if file_ext in ext_list:
# 拼接目标文件夹路径
target_subfolder = os.path.join(target_folder, folder_name)
# 若目标文件夹不存在,自动创建
if not os.path.exists(target_subfolder):
os.makedirs(target_subfolder)
print(f"已创建文件夹:{folder_name}")
# 移动文件到目标文件夹(若文件已存在,会覆盖,可根据需求修改)
shutil.move(file_path, os.path.join(target_subfolder, file_name))
print(f"已移动:{file_name} → {folder_name}")
# 标记文件已分类
classified = True
break # 找到对应类型后,跳出循环
# 6. 若未匹配到任何类型,移动到"其他文件"文件夹
if not classified:
other_folder = os.path.join(target_folder, "其他文件")
if not os.path.exists(other_folder):
os.makedirs(other_folder)
shutil.move(file_path, os.path.join(other_folder, file_name))
print(f"已移动(未匹配类型):{file_name} → 其他文件")
# ------------------- 调用函数(修改为你的目标文件夹路径) -------------------
if __name__ == "__main__":
# 示例:Windows路径(注意用双反斜杠\\,或单斜杠/)
# target = "C:\\Users\\你的用户名\\Desktop\\测试文件夹"
# 示例:Mac/Linux路径
# target = "/Users/你的用户名/Desktop/测试文件夹"
# 建议先在"测试文件夹"中放入各类文件,再执行代码
target_folder = "测试文件夹" # 相对路径(与代码文件同目录)
print("开始自动分类文件...")
auto_classify_files(target_folder)
print("文件分类完成!")
效果演示
-
在 “测试文件夹” 中放入以下测试文件:
风景.jpg、头像.png(图片)工作总结.docx、学习笔记.pdf(文档)电影.mp4(视频)音乐.mp3(音频)Python安装包.exe、资料压缩包.zip(安装包 / 压缩包)hello.py(代码文件)未知格式.abc(未匹配类型文件)
-
运行代码后,打开 “测试文件夹”,会发现自动生成了 “图片文件”“文档文件” 等子文件夹,所有文件已按类型自动移动到对应文件夹中,“未知格式.abc” 被放入 “其他文件”。
四、功能 2:文件批量重命名 —— 按 “规则” 统一命名格式
需求场景
下载的资料命名混乱?比如 “微信图片_20240101123456.jpg”“Screenshot_123.png”,想统一改成 “旅行照片_001.jpg”“旅行照片_002.png” 的格式;或者将 “报告_最终版_改 1.docx”“报告_最终版_改 2.docx” 统一整理为 “2024 年度报告_V1.docx”“2024 年度报告_V2.docx”。
我们实现两种常用的重命名规则,可根据需求切换:
- 规则 1:按 “前缀 + 序号” 命名(如 “旅行照片_001.jpg”“旅行照片_002.jpg”)
- 规则 2:按 “旧文件名替换关键词” 命名(如将所有 “最终版” 替换为 “V1.0”)
核心思路
- 规则 1:遍历目标文件夹中的指定类型文件,按顺序分配序号(支持补零,如 001、002),拼接 “前缀 + 序号 + 原后缀” 作为新文件名。
- 规则 2:遍历目标文件夹中的所有文件,将文件名中的指定关键词替换为新关键词,保持其他部分不变。
完整代码(带详细注释)
import os
def batch_rename_files(target_folder, rename_rule, **kwargs):
"""
批量重命名文件
:param target_folder: 目标文件夹路径
:param rename_rule: 重命名规则(1:前缀+序号;2:关键词替换)
:param kwargs: 规则对应的参数(rule1需传prefix;rule2需传old_key、new_key)
"""
# 遍历目标文件夹中的所有文件(跳过子文件夹)
file_list = [f for f in os.listdir(target_folder) if os.path.isfile(os.path.join(target_folder, f))]
if not file_list:
print("目标文件夹中没有文件可重命名!")
return
# 规则1:前缀+序号(如“旅行照片_001.jpg”)
if rename_rule == 1:
# 检查是否传入“前缀”参数
if "prefix" not in kwargs:
print("规则1需要传入'prefix'参数(如prefix='旅行照片')!")
return
prefix = kwargs["prefix"]
# 可选参数:序号起始值(默认1)、序号位数(默认3,即001、002)
start_num = kwargs.get("start_num", 1)
num_digits = kwargs.get("num_digits", 3)
print(f"按规则1重命名:前缀='{prefix}', 起始序号={start_num}, 序号位数={num_digits}")
# 遍历文件,按顺序重命名
for idx, file_name in enumerate(file_list, start=start_num):
# 获取原文件的后缀名
file_ext = os.path.splitext(file_name)[1]
# 生成序号(补零,如num_digits=3时,1→001)
serial_num = str(idx).zfill(num_digits)
# 生成新文件名
new_file_name = f"{prefix}_{serial_num}{file_ext}"
# 拼接原路径和新路径
old_path = os.path.join(target_folder, file_name)
new_path = os.path.join(target_folder, new_file_name)
# 执行重命名(若新文件名已存在,会报错,可根据需求修改)
os.rename(old_path, new_path)
print(f"已重命名:{file_name} → {new_file_name}")
# 规则2:关键词替换(如将“最终版”替换为“V1.0”)
elif rename_rule == 2:
# 检查是否传入“旧关键词”和“新关键词”参数
if "old_key" not in kwargs or "new_key" not in kwargs:
print("规则2需要传入'old_key'和'new_key'参数(如old_key='最终版', new_key='V1.0')!")
return
old_key = kwargs["old_key"]
new_key = kwargs["new_key"]
print(f"按规则2重命名:将'{old_key}'替换为'{new_key}'")
# 遍历文件,替换关键词
for file_name in file_list:
# 检查文件名是否包含旧关键词
if old_key in file_name:
# 替换关键词生成新文件名
new_file_name = file_name.replace(old_key, new_key)
# 拼接原路径和新路径
old_path = os.path.join(target_folder, file_name)
new_path = os.path.join(target_folder, new_file_name)
# 执行重命名
os.rename(old_path, new_path)
print(f"已重命名:{file_name} → {new_file_name}")
else:
print(f"跳过(不含关键词):{file_name}")
else:
print("无效的重命名规则!请选择1或2。")
# ------------------- 调用函数(根据需求选择规则) -------------------
if __name__ == "__main__":
target_folder = "测试文件夹/图片文件" # 以“图片文件”子文件夹为例
# 选择规则1:前缀+序号(将图片统一命名为“旅行照片_001.jpg”“旅行照片_002.jpg”)
print("=== 执行规则1:前缀+序号 ===")
batch_rename_files(
target_folder=target_folder,
rename_rule=1,
prefix="旅行照片", # 前缀
start_num=1, # 起始序号
num_digits=3 # 序号位数(补零)
)
# # 选择规则2:关键词替换(将“旅行照片”替换为“2024旅行记录”)
# print("\n=== 执行规则2:关键词替换 ===")
# batch_rename_files(
# target_folder=target_folder,
# rename_rule=2,
# old_key="旅行照片", # 旧关键词
# new_key="2024旅行记录" # 新关键词
# )
print("\n批量重命名完成!")
效果演示
- 规则 1 效果:假设 “图片文件” 文件夹中有
风景.jpg、头像.png,执行规则 1 后,文件名变为旅行照片_001.jpg、旅行照片_002.png。 - 规则 2 效果:若再执行规则 2(将 “旅行照片” 替换为 “2024 旅行记录”),文件名会变为
2024旅行记录_001.jpg、2024旅行记录_002.png。
五、功能 3:文件快速查找 —— 按 “关键词 + 类型” 精准定位
需求场景
电脑里文件太多,想找 “包含‘Python’关键词的.pdf 文件”,但记不清具体放在哪个文件夹?传统方式需要逐层打开文件夹查找,效率极低。我们可以实现一个 “按关键词 + 文件类型” 的快速查找功能,输入关键词和类型后,秒级返回所有匹配文件的路径。
核心思路
- 接收用户输入的 “目标根目录”“关键词”“文件类型(可选)”
- 递归遍历根目录下的所有文件(包括子文件夹中的文件)
- 对每个文件,判断 “文件名是否包含关键词” 且 “文件类型是否匹配(若指定)”
- 收集所有匹配文件的路径,最终打印输出
完整代码(带详细注释)
import os
def search_files(root_folder, keyword, file_ext=None):
"""
按关键词和文件类型查找文件
:param root_folder: 查找的根目录(会递归查找所有子文件夹)
:param keyword: 文件名中的关键词(不区分大小写)
:param file_ext: 目标文件类型(如".pdf",可选,不指定则匹配所有类型)
:return: 匹配文件的路径列表
"""
matched_files = []
# 递归遍历根目录下的所有文件和子文件夹
for root, dirs, files in os.walk(root_folder):
for file_name in files:
# 1. 检查文件名是否包含关键词(不区分大小写)
if keyword.lower() in file_name.lower():
# 2. 检查文件类型(若指定了类型)
if file_ext:
# 统一转换为小写,避免大小写问题(如".PDF"和".pdf")
if os.path.splitext(file_name)[1].lower() == file_ext.lower():
# 拼接完整路径并添加到结果列表
file_path = os.path.join(root, file_name)
matched_files.append(file_path)
else:
# 未指定类型,直接添加所有含关键词的文件
file_path = os.path.join(root, file_name)
matched_files.append(file_path)
return matched_files
# ------------------- 调用函数(输入查找条件) -------------------
if __name__ == "__main__":
print("=== Python文件快速查找工具 ===")
# 1. 输入查找条件(可根据自己需求修改)
root_folder = "测试文件夹" # 查找的根目录(递归查找所有子文件夹)
search_keyword = "Python" # 文件名中的关键词(如“Python”“报告”)
target_ext = ".pdf" # 目标文件类型(如".pdf",设为None则查找所有类型)
# 2. 执行查找
print(f"正在查找:{root_folder} 下,更多推荐


所有评论(0)