第4讲:智能文件分类器——一秒归档杂乱文件夹

发布时间:2026/11/5 15:27:25

第4讲:智能文件分类器——一秒归档杂乱文件夹 本讲目标掌握按多种规则分类文件的思路学会按扩展名、文件大小、修改日期三种策略分类实战案例一键整理下载目录一、场景描述你的下载文件夹是不是这样的GoogleSetup.exe 项目需求文档.pdf 微信图片_20260713.png team_meeting.mp4 数据报表.xlsx 乱七八糟.zip node-v18.17.0.msi 年会合照.jpg readme.txt installer.dmg每次找文件都要翻半天而且越积越多最后干脆不敢打开下载文件夹。上一讲我们做了按扩展名分类但实际工作中你可能还需要按文件大小分类小文件、大文件、超大文件按修改日期分类今天、本周、本月、更早按文件年龄分类新文件、旧文件、归档文件这一讲我们把这三种策略都实现并且做成一个可以选择策略的工具。二、策略一按扩展名分类升级版上一讲我们已经做过基础版这里做一个更完善的版本支持自定义分类规则。2.1 完整代码新建文件classify_by_type.pyimport os import shutil def classify_by_extension(source_dir): 按扩展名分类文件 # 分类规则文件夹名 → 扩展名列表 categories { 图片: [.jpg, .jpeg, .png, .gif, .bmp, .webp, .svg], 文档: [.docx, .doc, .pdf, .xlsx, .xls, .pptx, .ppt, .txt, .md, .csv, .json, .xml], 视频: [.mp4, .avi, .mov, .mkv, .wmv, .flv], 音频: [.mp3, .wav, .flac, .aac, .ogg], 压缩包: [.zip, .rar, .7z, .tar, .gz, .bz2], 安装包: [.exe, .msi, .dmg, .apk, .deb], 代码: [.py, .js, .java, .cpp, .html, .css, .sql, .sh], } # 统计处理结果 stats {name: 0 for name in categories} stats[未分类] 0 for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) # 跳过文件夹 if os.path.isdir(file_path): continue # 获取扩展名 _, ext os.path.splitext(filename) ext ext.lower() # 查找所属类别 moved False for folder_name, extensions in categories.items(): if ext in extensions: target_dir os.path.join(source_dir, folder_name) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) stats[folder_name] 1 moved True break if not moved: # 未匹配的文件放入其他文件夹 other_dir os.path.join(source_dir, 其他) os.makedirs(other_dir, exist_okTrue) shutil.move(file_path, os.path.join(other_dir, filename)) stats[未分类] 1 return stats if __name__ __main__: folder input(请输入要整理的文件夹路径).strip().strip(\) if not os.path.exists(folder): print(❌ 文件夹不存在) else: print( 正在按扩展名分类...) result classify_by_extension(folder) print(\n 整理结果) for category, count in result.items(): if count 0: print(f ✅ {category}: {count} 个文件) print( 整理完成)三、策略二按文件大小分类有时候你想把大文件挑出来单独处理比如把超过 100MB 的视频移到移动硬盘。3.1 完整代码新建文件classify_by_size.pyimport os import shutil def get_size_category(size_bytes): 根据文件大小返回分类名称 # 转换为 KB、MB、GB size_kb size_bytes / 1024 size_mb size_kb / 1024 size_gb size_mb / 1024 if size_gb 1: return 超大型_1GB以上, f{size_gb:.2f} GB elif size_mb 100: return 大型_100MB-1GB, f{size_mb:.2f} MB elif size_mb 10: return 中型_10MB-100MB, f{size_mb:.2f} MB elif size_mb 1: return 小型_1MB-10MB, f{size_mb:.2f} MB else: return 微型_1MB以下, f{size_kb:.2f} KB def classify_by_size(source_dir): 按文件大小分类 stats {} for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue # 获取文件大小并分类 size_bytes os.path.getsize(file_path) category, size_str get_size_category(size_bytes) # 创建分类文件夹并移动 target_dir os.path.join(source_dir, category) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) # 统计 stats[category] stats.get(category, 0) 1 print(f {filename} ({size_str}) → {category}) return stats if __name__ __main__: folder input(请输入要整理的文件夹路径).strip().strip(\) if not os.path.exists(folder): print(❌ 文件夹不存在) else: print( 正在按文件大小分类...) result classify_by_size(folder) print(\n 整理结果) for category, count in result.items(): print(f ✅ {category}: {count} 个文件) print( 整理完成)3.2 运行示例请输入要整理的文件夹路径C:\Users\admin\Downloads 正在按文件大小分类... node-v18.17.0.msi (152.34 MB) → 大型_100MB-1GB team_meeting.mp4 (85.23 MB) → 中型_10MB-100MB 数据报表.xlsx (3.45 MB) → 小型_1MB-10MB readme.txt (12.56 KB) → 微型_1MB以下 整理结果 ✅ 大型_100MB-1GB: 1 个文件 ✅ 中型_10MB-100MB: 1 个文件 ✅ 小型_1MB-10MB: 1 个文件 ✅ 微型_1MB以下: 1 个文件 整理完成四、策略三按修改日期分类这个策略特别适合整理照片和工作文件按时间归档一目了然。4.1 完整代码新建文件classify_by_date.pyimport os import shutil from datetime import datetime, date def get_date_category(mod_timestamp): 根据修改时间返回分类名称 mod_date datetime.fromtimestamp(mod_timestamp).date() today date.today() # 计算天数差 days_diff (today - mod_date).days if days_diff 0: return 今天 elif days_diff 1: return 昨天 elif days_diff 7: return 本周 elif days_diff 30: return 本月 elif days_diff 90: return 近三个月 elif days_diff 180: return 近半年 else: # 超过半年的按年月分类 return mod_date.strftime(%Y年%m月) def classify_by_date(source_dir): 按修改日期分类 stats {} for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue # 获取文件修改时间 mod_timestamp os.path.getmtime(file_path) category get_date_category(mod_timestamp) # 创建分类文件夹并移动 target_dir os.path.join(source_dir, category) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) # 统计 stats[category] stats.get(category, 0) 1 mod_date datetime.fromtimestamp(mod_timestamp).strftime(%Y-%m-%d) print(f {filename} (修改于 {mod_date}) → {category}) return stats if __name__ __main__: folder input(请输入要整理的文件夹路径).strip().strip(\) if not os.path.exists(folder): print(❌ 文件夹不存在) else: print( 正在按修改日期分类...) result classify_by_date(folder) print(\n 整理结果) for category, count in sorted(result.items()): print(f ✅ {category}: {count} 个文件) print( 整理完成)五、综合版三合一分类工具箱把三种策略整合到一个脚本中运行时让用户选择用哪种方式。5.1 完整代码新建文件smart_classifier.pyimport os import shutil from datetime import datetime, date def show_menu(): 显示菜单 print(\n *40) print( 智能文件分类器) print(*40) print(1. 按扩展名分类图片/文档/视频等) print(2. 按文件大小分类微型/小型/中型/大型) print(3. 按修改日期分类今天/本周/本月等) print(0. 退出) print(*40) def classify_by_extension(source_dir): 按扩展名分类 categories { 图片: [.jpg, .jpeg, .png, .gif, .bmp, .webp, .svg], 文档: [.docx, .doc, .pdf, .xlsx, .xls, .pptx, .ppt, .txt, .md, .csv, .json, .xml], 视频: [.mp4, .avi, .mov, .mkv, .wmv, .flv], 音频: [.mp3, .wav, .flac, .aac, .ogg], 压缩包: [.zip, .rar, .7z, .tar, .gz, .bz2], 安装包: [.exe, .msi, .dmg, .apk, .deb], 代码: [.py, .js, .java, .cpp, .html, .css, .sql, .sh], } stats {name: 0 for name in categories} stats[其他] 0 for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue _, ext os.path.splitext(filename) ext ext.lower() moved False for folder_name, extensions in categories.items(): if ext in extensions: target_dir os.path.join(source_dir, folder_name) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) stats[folder_name] 1 moved True break if not moved: other_dir os.path.join(source_dir, 其他) os.makedirs(other_dir, exist_okTrue) shutil.move(file_path, os.path.join(other_dir, filename)) stats[其他] 1 return stats def classify_by_size(source_dir): 按文件大小分类 def get_category(size_bytes): size_mb size_bytes / 1024 / 1024 if size_mb 1000: return 超大型_1GB以上 elif size_mb 100: return 大型_100MB-1GB elif size_mb 10: return 中型_10MB-100MB elif size_mb 1: return 小型_1MB-10MB else: return 微型_1MB以下 stats {} for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue size_bytes os.path.getsize(file_path) category get_category(size_bytes) target_dir os.path.join(source_dir, category) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) stats[category] stats.get(category, 0) 1 size_mb size_bytes / 1024 / 1024 print(f {filename} ({size_mb:.2f} MB)) return stats def classify_by_date(source_dir): 按修改日期分类 def get_category(mod_timestamp): mod_date datetime.fromtimestamp(mod_timestamp).date() today date.today() days_diff (today - mod_date).days if days_diff 0: return 今天 elif days_diff 7: return 本周 elif days_diff 30: return 本月 elif days_diff 90: return 近三个月 else: return mod_date.strftime(%Y年%m月) stats {} for filename in os.listdir(source_dir): file_path os.path.join(source_dir, filename) if os.path.isdir(file_path): continue mod_timestamp os.path.getmtime(file_path) category get_category(mod_timestamp) target_dir os.path.join(source_dir, category) os.makedirs(target_dir, exist_okTrue) shutil.move(file_path, os.path.join(target_dir, filename)) stats[category] stats.get(category, 0) 1 mod_date datetime.fromtimestamp(mod_timestamp).strftime(%Y-%m-%d) print(f {filename} (修改于 {mod_date})) return stats if __name__ __main__: while True: show_menu() choice input(请选择分类方式 (0-3)).strip() if choice 0: print( 再见) break if choice not in [1, 2, 3]: print(❌ 无效选择请重新输入) continue folder input(请输入要整理的文件夹路径).strip().strip(\) if not os.path.exists(folder): print(❌ 文件夹不存在) continue print( 正在整理...) if choice 1: result classify_by_extension(folder) elif choice 2: result classify_by_size(folder) elif choice 3: result classify_by_date(folder) print(\n 整理结果) for category, count in sorted(result.items()): if count 0: print(f ✅ {category}: {count} 个文件) print( 整理完成)六、使用技巧与注意事项6.1 先备份再整理对于重要的文件夹建议先复制一份到别处再运行分类脚本。6.2 排除不想移动的文件在遍历时加入排除名单exclude_files [smart_classifier.py, 整理说明.txt] if filename in exclude_files: continue6.3 预览模式在实际移动前先打印将要执行的操作print( 预览操作) for filename in os.listdir(source_dir): # ... 判断逻辑 ... print(f 将移动: {filename} → {target_folder}) confirm input(确认执行(y/n): ) if confirm.lower() ! y: print(已取消) exit()七、本讲总结分类策略适用场景核心代码按扩展名日常文件整理os.path.splitext()按文件大小磁盘空间清理os.path.getsize()按修改日期照片/文档归档os.path.getmtime()三合一工具箱通用场景整合以上三种八、课后练习给按扩展名分类增加一个字体类别.ttf,.otf,.woff修改按日期分类的逻辑让超过一年的文件按2025年、2026年这样按年份分类挑战题给三合一工具箱增加第四个选项——按文件所有者分类提示用os.stat().st_uid下一讲预告​ 重复文件清扫员——释放你的磁盘空间。
延伸阅读

更多相关文章

2026/11/1 20:10:15

创造新技能并不断迭代改进现有技能的能力Skill

从宏观层面来说,技能的培养过程大致如下: 确定你希望这项技能实现什么功能,以及它大致应该如何实现。撰写一份技能草案创建一些测试提示,并运行 claude-with-access-to-the-skill 命令来测试它们。帮助用户对结果进行定性和定量评…

2026/10/25 22:14:31

2026系规备考风向标:老金给考生的三条“反常识”黄金建议

备战2026年软考系统规划与管理师,很多同学还在沿用旧教材的老套路,或者抱着历年真题死记硬背。作为常年在一线摸爬滚打的讲师,我想提醒大家:2026年的系规考试,正在发生你看不到的巨变。 针对今年的备考,我有…

2026/11/3 11:51:42

YOLOv11在树莓派上的推理优化:CPU速度提升43%是怎么做到的?

引言:当“目标检测卷王”遇上“百元板卡” 家人们谁懂啊!当我拿着那台仅需几百块的树莓派,成功把号称“目标检测天花板”的YOLOv11跑起来的时候,那种“小马拉大车”的成就感,比中了奶茶第二杯半价还爽! 很多人觉得树莓派就是个“玩具板卡”,YOLOv11这种前沿AI模型只能…

2026/11/5 15:00:49

基于Hadoop+Spark的民宿智能推荐系统设计与实现

1. 项目概述:大数据时代的民宿智能推荐这个毕业设计项目融合了当前大数据领域最主流的技术栈,构建了一个完整的民宿推荐系统解决方案。作为一名长期从事大数据系统开发的工程师,我认为这个选题非常贴合实际应用场景——随着旅游业的复苏和共享…

2026/11/5 14:10:30

ADS122U04IPWR+STM32F427ZI工业级温度测量信号链设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配RS485,解决远距离温度监控难题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 14:10:30

UART接口24位ADC搭配PIC18F46K22的RTD与热电偶测温实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 13:55:19

GD32E10x官方例程入门:从GPIO点灯到串口调试

简介:这份GD32E10x系列官方例程面向嵌入式硬件与单片机开发者,基于ARM Cortex-M3内核,汇集兆易创新GD32E10x的示例代码,适合工业控制、消费电子、通信设备等场景的学习、验证与二次开发。压缩包共935个文件,约11.16MB&…

2026/11/5 13:50:18

基于Django的运维平台实战:资产、发布、巡检、告警一体化

简介:这份资源是一套基于Django框架开发的运维平台源码,面向具备Python基础、希望了解Web运维系统实现思路的开发者与运维人员,可用于学习主机管理、服务监控、日志查看、任务调度、权限控制、资源统计、脚本执行与故障告警等常见运维模块的落…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑