新人第一次发帖,写了个自用的小脚本分享给大家~
平时逛论坛下载的各种附件、工具包堆在文件夹里又乱又杂,很多重复文件也发现不了,手动整理太麻烦,就用 Python 写了个轻量整理脚本,纯标准库实现,不用装额外依赖,分享给有同样需求的朋友。
1. 主要功能
智能分类归档:自动识别 zip/rar/7z 等常见压缩包,根据文件名关键词自动创建分类文件夹(工具类、教程类、源码类等)。
文件去重:通过 MD5 哈希值校验,自动删除重复文件,只保留一份,节省磁盘空间。
规范重命名:自动修正文件名乱码、去除冗余字符,统一命名格式,方便后续检索。
批量处理:支持遍历子文件夹,一键整理整个目录。
安全模式:默认仅复制文件到新目录,不修改原文件,避免误删。
2. 环境要求
Python 3.8 及以上版本。
仅使用 Python 标准库,无需 pip 安装任何第三方包。
3. 完整源码
import os
import hashlib
import shutil
import re
# 配置项
SOURCE_DIR = os.getcwd() # 默认整理当前脚本所在目录
OUTPUT_DIR = os.path.join(SOURCE_DIR, "整理结果")
FILE_TYPES = ('.zip', '.rar', '.7z', '.tar', '.gz')
CATEGORY_RULES = {
"工具类": ["工具", "助手", "批量", "破解", "脱壳", "补丁", "注册机"],
"教程类": ["教程", "教学", "入门", "指南", "文档", "笔记"],
"源码类": ["源码", "源代码", "项目", "脚本", "Python", "易语言", "C++"],
"其他": []
}
def get_file_md5(file_path):
"""计算文件MD5值"""
md5 = hashlib.md5()
with open(file_path, 'rb') as f:
for chunk in iter(lambda: f.read(8192), b''):
md5.update(chunk)
return md5.hexdigest()
def get_category(filename):
"""根据文件名匹配分类"""
for cate, keywords in CATEGORY_RULES.items():
for kw in keywords:
if kw in filename:
return cate
return "其他"
def clean_filename(filename):
"""规范文件名,去除冗余字符"""
name, ext = os.path.splitext(filename)
# 去除常见冗余前缀、多余空格和特殊字符
name = re.sub(r'^【.*?】', '', name)
name = re.sub(r'\s+', '_', name.strip())
name = re.sub(r'[^\w\u4e00-\u9fa5.-]', '', name)
return f"{name}{ext}"
def main():
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
md5_record = {}
total_count = 0
dup_count = 0
for root, _, files in os.walk(SOURCE_DIR):
# 跳过输出目录,避免循环处理
if OUTPUT_DIR in root:
continue
for file in files:
if not file.lower().endswith(FILE_TYPES):
continue
src_path = os.path.join(root, file)
total_count += 1
# 计算MD5去重
file_md5 = get_file_md5(src_path)
if file_md5 in md5_record:
dup_count += 1
continue
md5_record[file_md5] = file
# 确定分类和新文件名
category = get_category(file)
new_name = clean_filename(file)
cate_dir = os.path.join(OUTPUT_DIR, category)
if not os.path.exists(cate_dir):
os.makedirs(cate_dir)
# 处理重名
dst_path = os.path.join(cate_dir, new_name)
counter = 1
while os.path.exists(dst_path):
name, ext = os.path.splitext(new_name)
dst_path = os.path.join(cate_dir, f"{name}_{counter}{ext}")
counter += 1
shutil.copy2(src_path, dst_path)
print(f"处理完成!")
print(f"总文件数:{total_count}")
print(f"重复文件数:{dup_count}")
print(f"已整理文件数:{total_count - dup_count}")
print(f"整理结果已保存到:{OUTPUT_DIR}")
if __name__ == "__main__":
main()
4. 使用方法
- 把上面的代码复制保存为 整理附件.py。
- 将脚本放到你存放论坛附件的文件夹里。
- 双击运行(或命令行执行 python 整理附件.py)。
- 脚本会自动在当前目录生成「整理结果」文件夹,分类好的文件都在里面。
5. 注意事项
- 脚本默认是复制模式,原文件不会动,放心使用。
- 大文件较多时计算 MD5 会稍慢,属于正常情况。
- 分类规则可以自己在代码里修改关键词,适配自己的文件习惯。
第一次写分享帖,代码写得比较简单,有什么问题或者改进建议欢迎大家指出~感谢论坛提供的学习平台,以后也会多分享自己写的小东西,和大家一起交流进步。