Python 批量按文件类型分类整理:递归扫描全盘资料
用 Python 递归遍历文件夹,按 MIME/扩展名把文件分到图片、文档、代码、音视频等类别,适合整理项目目录、备份盘、归档资料。
场景痛点
按扩展名分文件只解决了一层目录的问题。真正头疼的是备份盘、项目目录里套着十几层子文件夹,文件散落在 2023/资料/旧、客户A/合同/扫描 各处,想按类型汇总到一处做归档,手动找半天还漏。用 Python os.walk 递归扫遍所有子目录,按文件类型统一分类、移动到目标归档盘,一次拉平。
用到的库
纯标准库,无需 pip 安装:
# os、shutil 为标准库
完整代码
import os
import shutil
# ========== 配置区 ==========
SOURCE_ROOT = "./混乱备份盘" # 要递归扫描的根目录
DEST_ROOT = "./按类型归档" # 归档目标根目录
DRY_RUN = True
CATEGORY_MAP = {
"图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".tiff"],
"文档": [".pdf", ".doc", ".docx", ".txt", ".md", ".rtf"],
"表格": [".xls", ".xlsx", ".csv"],
"演示": [".ppt", ".pptx", ".key"],
"视频": [".mp4", ".avi", ".mkv", ".mov"],
"音频": [".mp3", ".wav", ".flac"],
"压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],
"代码": [".py", ".js", ".java", ".go", ".c", ".cpp", ".html", ".css"],
}
OTHER_DIR = "其他"
# ============================
def get_category(ext: str) -> str:
ext = ext.lower()
for folder, exts in CATEGORY_MAP.items():
if ext in exts:
return folder
return OTHER_DIR
def main():
if not os.path.isdir(SOURCE_ROOT):
print(f"目录不存在:{SOURCE_ROOT}")
return
count = 0
# os.walk 递归遍历所有子目录
for dirpath, dirnames, filenames in os.walk(SOURCE_ROOT):
for name in filenames:
src_path = os.path.join(dirpath, name)
ext = os.path.splitext(name)[1]
category = get_category(ext)
dest_dir = os.path.join(DEST_ROOT, category)
dest_path = os.path.join(dest_dir, name)
# 重名时加来源目录前缀,避免覆盖
if os.path.exists(dest_path):
parent = os.path.basename(dirpath) or "root"
stem, e = os.path.splitext(name)
dest_path = os.path.join(dest_dir, f"{parent}_{stem}{e}")
print(f"[{'预览' if DRY_RUN else '移动'}] {src_path}\n -> {dest_path}")
if not DRY_RUN:
os.makedirs(dest_dir, exist_ok=True)
shutil.move(src_path, dest_path)
count += 1
print(f"\n共处理 {count} 个文件(DRY_RUN={DRY_RUN})")
if __name__ == "__main__":
main()
代码讲解
- os.walk:逐层递归遍历,
dirpath是当前目录绝对路径,filenames是这一层所有文件。它会自动钻进每一个子文件夹,不用自己写递归。 - 按类型分到大类目录:DEST_ROOT 下按「图片」「文档」「代码」建一级子目录,所有来源的同类文件汇总到一起,跨项目的同类资料一眼看全。
- 重名处理升级:递归场景下重名概率高(不同目录都有
报告.docx),这里把来源目录名拼到新文件名前,比如旧版_报告.docx,既不覆盖又能看出出处。 - 分类表更细:和上一篇相比,把「文档」拆出「表格」「演示」,加了「代码」分类,适合项目目录整理。
运行结果
终端打印每个文件的源路径和目标路径。DRY_RUN=True 时只列清单;改成 False 后,DEST_ROOT 下生成按类型分好的归档目录,文件全部归集过来。
注意事项
- 递归范围一定要看清楚:SOURCE_ROOT 指错了(比如指向整个 C 盘)会扫出几十万文件,先预览统计数量。
- 归档到另一个盘更安全:DEST_ROOT 和 SOURCE_ROOT 分开,避免脚本把自己要读的文件移走。
- 软链接/快捷方式:Windows 快捷方式
.lnk会被当成普通文件归到「其他」,不想要就过滤。 - 长路径:Windows 下嵌套很深的目录可能触发 260 字符路径限制,必要时开系统长路径支持。
- 先备份再归档:递归移动比单层整理风险大,重要数据先整体复制一份。

更新时间:2026-09-14 21:30:49