使用Python按文件后缀名自动归类杂乱桌面文件
作者:小庄-Python办公
还在为桌面文件杂乱而烦恼吗,本文将教你用Python按文件后缀名自动分类整理文件,无需安装任何额外库,只需使用内置的pathlib和shutil模块,你将学会如何将PDF、Word、图片、视频等文件自动移动到对应文件夹,并包含避免覆盖、预览模式等实用技巧,让你的桌面瞬间整洁
场景引入
你的桌面是不是这样?
桌面/ ├── 合同终稿_v3_final.pdf ├── 会议纪要.png ├── 预算报表.xlsx ├── 产品宣传视频.mp4 ├── 老照片_2019.jpg ├── 项目方案.docx ├── 音乐文件.mp3 ├── 截图_20240301.png └── ...还有 200+ 个文件散落在桌面
每次想找某个文件都要翻半天。本节教你用 Python 按文件后缀名自动分类,桌面瞬间整洁。
技术原理
核心思路非常简单:
遍历目录 → 获取每个文件的后缀名 → 按后缀名创建文件夹 → 移动文件到对应文件夹
| 后缀 | 归类文件夹 | 说明 |
|---|---|---|
| PDF文档/ | PDF 文件 | |
| .doc, .docx | Word文档/ | Word 文件 |
| .xls, .xlsx | Excel表格/ | Excel 文件 |
| .jpg, .png, .gif, .bmp | 图片/ | 图片文件 |
| .mp4, .avi, .mov | 视频/ | 视频文件 |
| .mp3, .wav, .flac | 音频/ | 音频文件 |
| .zip, .rar, .7z | 压缩包/ | 压缩文件 |
| .py, .js, .java | 代码文件/ | 程序源代码 |
环境准备
无需安装额外库,使用 Python 内置模块即可。
完整代码
import os
import shutil
from pathlib import Path
# 文件类型分类规则
FILE_CATEGORIES = {
# 文档类
'.pdf': 'PDF文档',
'.doc': 'Word文档',
'.docx': 'Word文档',
'.wps': 'Word文档',
# 表格类
'.xls': 'Excel表格',
'.xlsx': 'Excel表格',
'.csv': 'Excel表格',
'.tsv': 'Excel表格',
# 演示类
'.ppt': 'PPT演示',
'.pptx': 'PPT演示',
# 图片类
'.jpg': '图片',
'.jpeg': '图片',
'.png': '图片',
'.gif': '图片',
'.bmp': '图片',
'.svg': '图片',
'.webp': '图片',
'.ico': '图片',
'.tiff': '图片',
# 视频类
'.mp4': '视频',
'.avi': '视频',
'.mov': '视频',
'.mkv': '视频',
'.flv': '视频',
'.wmv': '视频',
# 音频类
'.mp3': '音频',
'.wav': '音频',
'.flac': '音频',
'.aac': '音频',
'.ogg': '音频',
# 压缩包类
'.zip': '压缩包',
'.rar': '压缩包',
'.7z': '压缩包',
'.tar': '压缩包',
'.gz': '压缩包',
# 代码类
'.py': '代码文件',
'.js': '代码文件',
'.java': '代码文件',
'.c': '代码文件',
'.cpp': '代码文件',
'.html': '代码文件',
'.css': '代码文件',
# 其他
'.txt': '文本文件',
'.md': '文本文件',
'.exe': '可执行程序',
'.msi': '可执行程序',
'.dmg': '可执行程序',
}
def organize_files(target_dir, dry_run=False):
"""
按文件后缀名自动归类文件夹中的文件
参数:
target_dir: 要整理的目录路径
dry_run: True=只预览不移动,False=执行移动
"""
target_path = Path(target_dir)
if not target_path.exists():
print(f"错误:目录 {target_dir} 不存在!")
return
# 统计信息
moved_count = 0
skipped_count = 0
errors = []
# 遍历目录中的所有文件(不递归子文件夹)
for file_path in target_path.iterdir():
# 跳过文件夹
if file_path.is_dir():
continue
# 获取文件后缀
suffix = file_path.suffix.lower()
# 查找对应的分类
category = FILE_CATEGORIES.get(suffix, '其他文件')
# 创建分类文件夹
category_dir = target_path / category
category_dir.mkdir(exist_ok=True)
# 目标文件路径
dest = category_dir / file_path.name
# 如果目标已存在,加序号避免覆盖
if dest.exists():
stem = file_path.stem
counter = 1
while dest.exists():
dest = category_dir / f"{stem}_{counter}{suffix}"
counter += 1
# 执行移动
if dry_run:
print(f"[预览] {file_path.name} → {category}/")
moved_count += 1
else:
try:
shutil.move(str(file_path), str(dest))
print(f"[已移动] {file_path.name} → {category}/")
moved_count += 1
except Exception as e:
errors.append(f"{file_path.name}: {e}")
skipped_count += 1
# 汇总报告
print(f"\n{'='*40}")
print(f"整理完成!")
print(f"移动文件: {moved_count} 个")
if skipped_count > 0:
print(f"跳过文件: {skipped_count} 个")
if errors:
print(f"\n错误列表:")
for err in errors:
print(f" - {err}")
# ==================== 使用示例 ====================
if __name__ == "__main__":
# ========== 模式 1:先预览,确认无误 ==========
# organize_files(r"C:\Users\用户名\Desktop", dry_run=True)
# ========== 模式 2:执行移动 ==========
# organize_files(r"C:\Users\用户名\Desktop", dry_run=False)
# ========== 模式 3:整理下载文件夹 ==========
organize_files(r"D:\Downloads", dry_run=False)
代码逐行解析
1. Path 对象
target_path = Path(target_dir)
pathlib.Path 是 Python 3 推荐的路径操作方式,比 os.path 更直观:
| 操作 | os.path | pathlib |
|---|---|---|
| 拼接路径 | os.path.join(a, b) | a / b |
| 获取后缀 | os.path.splitext(f)[1] | f.suffix |
| 获取文件名 | os.path.basename(f) | f.name |
| 判断目录 | os.path.isdir(f) | f.is_dir() |
2. 获取后缀并分类
suffix = file_path.suffix.lower() category = FILE_CATEGORIES.get(suffix, '其他文件')
.suffix获取文件扩展名(如.pdf).lower()统一转小写,避免.PDF和.pdf分到不同类.get(suffix, '其他文件'):找不到匹配时归入"其他文件"
3. 避免覆盖
if dest.exists():
stem = file_path.stem
counter = 1
while dest.exists():
dest = category_dir / f"{stem}_{counter}{suffix}"
counter += 1
如果目标文件夹已有同名文件,自动加序号:报告.pdf → 报告_1.pdf → 报告_2.pdf
4. dry_run 预览模式
if dry_run:
print(f"[预览] {file_path.name} → {category}/")
else:
shutil.move(str(file_path), str(dest))
先运行 dry_run=True 预览分类结果,确认无误后再执行实际移动,避免误操作。
进阶技巧
技巧 1:按文件大小进一步分类
def get_size_category(size_bytes):
if size_bytes < 1024 * 1024: # < 1MB
return '小文件(<1MB)'
elif size_bytes < 100 * 1024 * 1024: # < 100MB
return '中等文件(1-100MB)'
else:
return '大文件(>100MB)'
# 在移动时结合大小
size_category = get_size_category(file_path.stat().st_size)
技巧 2:按日期分类(按创建月份归档)
from datetime import datetime
create_time = datetime.fromtimestamp(file_path.stat().st_ctime)
month_folder = create_time.strftime('%Y-%m')
技巧 3:清理空文件夹
整理完成后,可以清理原目录中残留的空文件夹:
import os
for dirpath, dirnames, filenames in os.walk(target_dir, topdown=False):
if not filenames and not dirnames:
os.rmdir(dirpath)
print(f"已删除空文件夹: {dirpath}")
常见问题
Q1:移动后文件找不到了?
使用 dry_run=True 先预览。如果已经移动了,可以在分类文件夹中找到文件——文件名没有改变,只是被移到了子文件夹中。
Q2:某些文件无法移动(“文件正在使用中”)?
原因:文件被其他程序打开或占用。
解决:关闭相关程序后再运行脚本,或该文件会出现在"错误列表"中。
Q3:想忽略某些文件(如 .lnk 快捷方式)?
在循环开头添加:
if file_path.suffix.lower() in ('.lnk', '.ini', '.tmp'):
continue
总结
| 核心操作 | 代码 | 作用 |
|---|---|---|
| 获取后缀 | file_path.suffix.lower() | 统一小写的扩展名 |
| 查分类表 | FILE_CATEGORIES.get(suffix) | 映射到文件夹名 |
| 创建目录 | category_dir.mkdir(exist_ok=True) | 不存在则创建 |
| 移动文件 | shutil.move(src, dest) | 物理移动文件 |
| 避免覆盖 | 自动加序号 | 文件_1.pdf |
| 安全预览 | dry_run=True | 只打印不移动 |
本节学会了用 Python 自动整理杂乱目录,让桌面和下载文件夹保持整洁。
以上就是使用Python按文件后缀名自动归类杂乱桌面文件的详细内容,更多关于Python按文件后缀名归类桌面文件的资料请关注脚本之家其它相关文章!
