第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下一讲预告​ 重复文件清扫员——释放你的磁盘空间。

相关新闻

最新新闻

英文词级分词技术:从基础规则到API集成的完整实现

英文词级分词技术:从基础规则到API集成的完整实现

自然语言处理中的词级分词是文本分析的基础环节,尤其在英文处理中看似简单却暗藏细节。这次我们聚焦英文词级分词的技术实现,重点解析空格分隔规则下的特殊场景处理、连字符词与专有名词的识别策略,以及如何通过规则与统计结合的方式提升分词…

2026/7/16 10:41:06
健身程序以消耗卡路里为目标,编写程序,记录运动之后的思维活跃指数,挑选最能激发灵感的运动方式,服务脑力创新。

健身程序以消耗卡路里为目标,编写程序,记录运动之后的思维活跃指数,挑选最能激发灵感的运动方式,服务脑力创新。

用 Python 编写一套以“消耗卡路里 思维活跃指数”为核心的健身‑创新辅助程序。内容严格按给定的结构组织,去除营销化表达,保持中立、可复现、可扩展。一、实际应用场景描述(Scene)在心理健康与创新能力相关课程中,一…

2026/7/16 10:41:06
YOLOv8-seg在医疗图像分割中的优化与应用

YOLOv8-seg在医疗图像分割中的优化与应用

1. 医疗设备显示器图像分割的挑战与需求医疗设备显示器图像分割是计算机视觉在医疗领域的重要应用场景。这类图像通常具有以下典型特征:高分辨率、多模态显示(如CT、MRI、超声等)、实时性要求高,且常包含大量文字和数字信息。传统…

2026/7/16 10:41:06
FU6832L电机驱动芯片双核架构与硬件加速解析

FU6832L电机驱动芯片双核架构与硬件加速解析

1. FU6832L开发板核心特性解析 FU6832L是峰岹科技推出的一款高性能电机驱动专用芯片,其独特之处在于采用了双核架构设计。这个架构由8051内核和专用电机控制引擎(ME)组成,两者协同工作实现了高效的电机控制方案。在实际工业应用中,这种设计能…

2026/7/16 10:41:06
FPGA数字锁相倍频电路设计与高速ADC接口优化

FPGA数字锁相倍频电路设计与高速ADC接口优化

1. 项目背景与需求分析在工业测控和精密仪器领域,数字锁相倍频电路是实现高精度信号处理的核心模块。传统基于分立元件的模拟锁相环存在温漂大、参数调整困难等问题,而纯数字方案在高速场景下又面临处理速度瓶颈。本项目采用FPGAADS7864的组合方案&#…

2026/7/16 10:41:06
Windows Server 2028 Build 29574新特性与性能优化解析

Windows Server 2028 Build 29574新特性与性能优化解析

1. Windows Server 2028 Build 29574初探作为一名长期跟踪Windows Server技术演进的系统工程师,当我看到Build 29574这个预览版本发布时,立刻意识到这可能是下一代服务器操作系统的重要里程碑。这个隶属于Long-Term Servicing Channel(LTSC&a…

2026/7/16 10:36:06

月新闻