发布时间:2026/7/16 9:15:35
第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/7/16 9:15:35

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

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

2026/7/16 9:15:35

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

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

2026/7/16 9:10:35

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

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

2026/7/16 11:10:56

Linux系统架构解析:从内核到应用的全景指南

1. Linux系统结构全景解析第一次接触Linux时,我被它的简洁与强大所震撼。与Windows不同,Linux更像一个精心设计的乐高积木系统——每个组件各司其职又紧密配合。让我们从内核这个"心脏"开始,逐步拆解这个开源王国的核心架构。Linux…

2026/7/16 11:10:56

VeLoCity皮肤:为VLC播放器注入现代美学的5款终极视觉方案

VeLoCity皮肤:为VLC播放器注入现代美学的5款终极视觉方案 【免费下载链接】VeLoCity-Skin-for-VLC Castom skin for VLC Player 项目地址: https://gitcode.com/gh_mirrors/ve/VeLoCity-Skin-for-VLC 厌倦了VLC播放器千篇一律的默认界面?VeLoCity…

2026/7/16 11:10:56

Windows命令行工具全解析:从基础到高阶应用

1. Windows命令行的前世今生作为Windows系统管理员和开发者最亲密的战友,命令行工具已经伴随我们走过了三十多个年头。从早期的DOS系统到现代Windows 10/11,命令行工具不仅没有消失,反而在系统维护、自动化运维等领域发挥着不可替代的作用。提…

2026/7/16 11:10:56

迪文COF智能屏与ESP32-S3的MP3播放器设计实战

1. 迪文COF智能屏与MP3播放器的完美结合 第一次拿到迪文DMT48270C043_15WT这块4.3英寸智能屏时,最让我惊讶的是它T5UID1芯片的处理能力——480272的分辨率下播放MP3音频居然毫无压力。作为一款典型的COF(Chip On Film)结构屏,它将…

2026/7/16 11:10:56

WeMos D1 ESP8266开发板实战:从环境搭建到Web Server项目全解析

1. WeMos D1 ESP8266开发板初探 第一次拿到WeMos D1 ESP8266开发板时,我差点以为这是一块Arduino Uno的克隆版——它们的外形实在太像了。但仔细看就会发现,这块信用卡大小的板子藏着不少玄机。作为一款基于ESP8266芯片的开发板,它最大的特点…

2026/7/16 11:05:56

Windows 10下Maven 3.8.1的安装、配置与阿里云镜像加速实战

1. 环境准备与Maven简介 刚接触Java开发的朋友们可能经常听到"Maven"这个词,它就像是Java项目的"智能管家"。简单来说,Maven能帮你自动下载项目需要的各种库文件(我们称之为依赖),还能帮你编译代码…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/15 22:21:34

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/15 23:18:22

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/16 0:04:06

AD9215BRUZRL7-105是一款工业 10bit 流水线模数转换器

型号介绍AD9215BRUZRL7-105 是一款10 位单通道高速流水线模数转换器,它采用模拟单电源独立供电 数字驱动分离供电双电源架构,模拟电源 AVDD 额定 3V,允许工作区间 2.7V~3.3V;数字驱动电源 DRV 独立设计,支持 2.25V~3.…

2026/7/16 0:04:06

LTC4418IUF#TRPBF是一款工业级双通道控制器

型号介绍LTC4418IUF#TRPBF 是一款工业级双通道电源路径控制器,它芯片采用 20 引脚 4mm4mm QFN 封装,底部附带外露散热焊盘作为 21 号 GND 引脚,热阻 θJA 为 47℃/W、θJC 仅 4.5℃/W,散热性能适配大功率切换场景;温区…

2026/7/16 0:04:06

uos-exporter核心组件解析:10个关键监控导出器功能详解

uos-exporter核心组件解析:10个关键监控导出器功能详解 【免费下载链接】uos-exporter uos-exporter collects metrics from os 项目地址: https://gitcode.com/openeuler/uos-exporter 前往项目官网免费下载:https://ar.openeuler.org/ar/ uos-…

2026/7/15 13:36:32

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…