我的知识记录

Python 按扩展名归类文件到文件夹:一键整理杂乱下载目录

用 Python 把文件夹里的文件按扩展名自动分到图片、文档、视频、压缩包等子文件夹,如 jpg/png 进「图片」、pdf/docx 进「文档」,附预览。

场景痛点

下载目录、桌面、微信接收文件夹永远是一团乱:图片、PDF、安装包、视频、表格混在一起,找个文件要翻半天。手动一个个拖到对应文件夹,分类规则一乱又得重排。用 Python 按扩展名自动归类,jpg/png 进「图片」、pdf/docx 进「文档」、mp4 进「视频」,没有匹配的进「其他」,一次整理干净。

用到的库

纯标准库,无需 pip 安装:

# os、shutil 为标准库

完整代码

import os
import shutil

# ========== 配置区 ==========
SOURCE_DIR = "./下载"        # 要整理的文件夹
DRY_RUN = True              # True=预览,False=真正移动
# 扩展名 -> 目标文件夹名(小写比较)
CATEGORY_MAP = {
"图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp", ".svg"],
"文档": [".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".txt", ".md"],
"视频": [".mp4", ".avi", ".mkv", ".mov", ".flv"],
"音频": [".mp3", ".wav", ".flac", ".aac"],
"压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],
"程序": [".exe", ".msi", ".dmg", ".apk"],
}
OTHER_DIR = "其他"
# ============================


def get_category(ext: str) -> str:
"""根据扩展名找分类,找不到返回 OTHER_DIR。"""
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_DIR):
print(f"目录不存在:{SOURCE_DIR}")
return

count = 0
for name in os.listdir(SOURCE_DIR):
src_path = os.path.join(SOURCE_DIR, name)
# 只处理文件,跳过已经整理好的分类文件夹
if not os.path.isfile(src_path):
continue

ext = os.path.splitext(name)[1]
category = get_category(ext)
dest_dir = os.path.join(SOURCE_DIR, category)

# 目标重名时改名,避免覆盖
dest_path = os.path.join(dest_dir, name)
if os.path.exists(dest_path):
stem, e = os.path.splitext(name)
dest_path = os.path.join(dest_dir, f"{stem}_重名{e}")

action = "[预览]" if DRY_RUN else "[移动]"
print(f"{action} {name}  ->  {category}/")

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()

代码讲解

  • CATEGORY_MAP:用字典把扩展名映射到分类文件夹名。想加分类、调归类直接改这个表,不用动主逻辑。
  • get_category:扩展名统一转小写再匹配,.JPG.jpg 都能命中。匹配不上就落到 其他 文件夹,不会丢文件。
  • os.makedirs(exist_ok=True):分类文件夹不存在就自动建,已存在也不报错。
  • 重名保护:目标位置已经有同名文件,就给新文件加 _重名 后缀,绝不覆盖。
  • 跳过已有文件夹os.path.isfile 判断只处理文件,已经整理好的分类目录不会被当文件再处理。

运行结果

终端逐条打印 风景.jpg -> 图片/。预览确认分类都对,把 DRY_RUN 改成 False 跑一遍,源文件夹下就多出「图片」「文档」「视频」等子文件夹,文件各归各位。

注意事项

  • dry-run 必跑:移动是跨文件操作,预览看清楚每个文件进哪个文件夹,再正式执行。
  • 源目录就是分类目录本身:本脚本在 SOURCE_DIR 下建分类文件夹,别拿一个你不熟悉的目录直接跑。
  • .DS_Store、隐藏文件:macOS 下 .DS_Store 会被归到「其他」,不想要就加跳过 . 开头的逻辑。
  • shutil.move 跨盘也能搬:和 os.rename 不同,shutil.move 支持跨磁盘,但耗时更长。
  • 整理前备份:重要文件先复制一份,分类错了也好恢复。

Python 按扩展名归类文件到文件夹:一键整理杂乱下载目录

标签:

更新时间:2026-09-14 21:14:57

上一篇:Python批量打包发送文件夹:zip后自动发送邮件附件

下一篇:Python按文件名关键词搜索文件教程