You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python实现按文件类型/扩展名排序后跨目录移动文件

Python按文件扩展名/类型排序移动文件实现方案

核心实现逻辑

整个功能可以拆分为4个步骤实现,仅依赖Python标准库,无需安装第三方依赖:

  1. 遍历源目录下的所有目标文件,可按需选择是否递归遍历子目录
  2. 为每个文件提取排序用的特征键(扩展名/自定义文件类型)
  3. 调用sorted()方法按特征键对文件列表排序
  4. 按排序后的顺序执行移动操作,可增加重名冲突处理逻辑避免覆盖文件

代码示例

按扩展名排序移动

import os
import shutil
from pathlib import Path

def move_sorted_by_ext(source_dir: str, target_dir: str) -> None:
    # 校验源目录合法性
    if not os.path.isdir(source_dir):
        raise NotADirectoryError(f"源目录 {source_dir} 不存在")
    # 自动创建不存在的目标目录
    Path(target_dir).mkdir(parents=True, exist_ok=True)

    # 提取源目录下所有文件(不包含子目录,需要递归的话把iterdir换成rglob("*"))
    file_list = [f for f in Path(source_dir).iterdir() if f.is_file()]
    # 按扩展名小写排序,需要降序的话增加reverse=True参数
    sorted_files = sorted(file_list, key=lambda x: x.suffix.lower())

    # 逐个执行移动
    for file in sorted_files:
        target_path = os.path.join(target_dir, file.name)
        # 重名文件处理,自动加序号后缀
        counter = 1
        while os.path.exists(target_path):
            target_path = os.path.join(target_dir, f"{file.stem}_{counter}{file.suffix}")
            counter += 1
        shutil.move(str(file), target_path)
        print(f"移动完成:{file.name} -> {target_path}")

按自定义文件类型排序移动

首先提前定义文件类型映射和排序优先级,可根据自己的需求增删调整:

# 自定义扩展名与文件类型的映射关系
TYPE_MAPPING = {
    "图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"],
    "文档": [".doc", ".docx", ".pdf", ".txt", ".xls", ".xlsx", ".ppt", ".pptx", ".md"],
    "视频": [".mp4", ".avi", ".mov", ".mkv", ".flv"],
    "音频": [".mp3", ".wav", ".flac", ".aac"],
    "压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"]
}
# 类型排序优先级,未匹配到的文件统一归为「其他」,排在最后
TYPE_ORDER = ["图片", "文档", "视频", "音频", "压缩包", "其他"]

def get_file_type(file_suffix: str) -> str:
    suffix = file_suffix.lower()
    for type_name, ext_list in TYPE_MAPPING.items():
        if suffix in ext_list:
            return type_name
    return "其他"

def move_sorted_by_type(source_dir: str, target_dir: str) -> None:
    if not os.path.isdir(source_dir):
        raise NotADirectoryError(f"源目录 {source_dir} 不存在")
    Path(target_dir).mkdir(parents=True, exist_ok=True)

    file_list = [f for f in Path(source_dir).iterdir() if f.is_file()]
    # 按类型优先级排序,同类型下可再加扩展名排序:key=lambda x: (TYPE_ORDER.index(get_file_type(x.suffix)), x.suffix.lower())
    sorted_files = sorted(file_list, key=lambda x: TYPE_ORDER.index(get_file_type(x.suffix)))

    for file in sorted_files:
        target_path = os.path.join(target_dir, file.name)
        counter = 1
        while os.path.exists(target_path):
            target_path = os.path.join(target_dir, f"{file.stem}_{counter}{file.suffix}")
            counter += 1
        shutil.move(str(file), target_path)
        print(f"移动完成:{file.name} -> {target_path}")

使用说明

  • 调用方法非常简单,直接传入源目录和目标目录路径即可,比如move_sorted_by_ext("./下载", "./整理后的文件")
  • 正式执行移动前,可先把shutil.move替换为print语句打印移动路径,确认排序逻辑符合预期后再实际执行
  • 如果需要调整排序规则,仅修改sorted()方法的key参数即可,比如按文件大小、修改时间排序都可以直接调整key实现

内容的提问来源于stack exchange,提问作者DioOnAir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 02:33:02