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

如何使用Python按文件名信息自动将文件归类到对应文件夹

Python批量分拣基金归档文件实现方案

统一文件名规则:账号 - 客户姓名 - 基金名称 - 表单类型,示例文件名:7777777 - John Doe - BREIT - 1027

核心实现逻辑

整个脚本不需要复杂的文本识别、第三方依赖,完全基于固定文件名规则做拆分即可,核心逻辑只有3步:

  • 按固定分隔符拆分文件名:文件名统一用-(横杠前后各带一个空格)做字段分隔,拆分后第3个字段(序列索引为2)就是基金名称。哪怕文件名带.pdf/.docx这类扩展名,后缀会留在最后一个拆分字段里,完全不影响基金名称提取,不需要额外处理后缀。
  • 目录自动适配:提前建一个根目录,下面放待归档文件夹存所有下载的未分类文件,脚本运行时如果对应基金名称的文件夹不存在,会自动创建,不用提前手动建完50+个基金文件夹。
  • 异常兜底:遇到命名不符合规则、文件被占用无法移动的情况,自动把文件移到单独的异常文件夹,不会让脚本中途崩溃,最后统一人工核对异常文件即可,不会漏处理文件。

新手入门操作步骤

  • 先安装Python环境,全程只用Python内置的os(路径处理)和shutil(文件移动)库,不需要执行pip安装任何第三方包,新手不用折腾环境依赖。
  • 在本地建好归档根目录,把所有待处理的文件统一放到根目录下的待归档文件夹里。
  • 复制下文的示例代码,把代码里的ROOT_PATH配置改成你自己的归档根目录的实际路径,直接运行脚本即可。
  • 第一次运行前建议先复制一小部分测试文件跑一遍,确认分拣逻辑没问题,再批量处理所有正式文件,避免误操作。

可直接复用的最简代码

import os
import shutil

# --------------------------
# 新手只需要改这一行的路径即可
ROOT_PATH = r"D:\工作文件\基金归档"
# --------------------------
UNSORTED_PATH = os.path.join(ROOT_PATH, "待归档")
ERROR_PATH = os.path.join(ROOT_PATH, "命名异常待核对")

# 初始化必要文件夹,已存在则不重复创建
os.makedirs(UNSORTED_PATH, exist_ok=True)
os.makedirs(ERROR_PATH, exist_ok=True)

if __name__ == "__main__":
    # 遍历待归档文件夹下的所有内容
    for filename in os.listdir(UNSORTED_PATH):
        file_full_path = os.path.join(UNSORTED_PATH, filename)
        # 跳过子文件夹,只处理独立文件
        if os.path.isdir(file_full_path):
            continue
        
        try:
            # 按规则拆分文件名
            name_parts = [part.strip() for part in filename.split(" - ")]
            # 拆分后字段不足4个,判定为命名不规范
            if len(name_parts) < 4:
                shutil.move(file_full_path, os.path.join(ERROR_PATH, filename))
                print(f"[异常] {filename} 命名不符合规则,已移至异常核对文件夹")
                continue
            
            fund_name = name_parts[2]
            # 初始化对应基金的文件夹
            target_dir = os.path.join(ROOT_PATH, fund_name)
            os.makedirs(target_dir, exist_ok=True)
            
            # 处理重名文件,自动加序号避免覆盖
            target_file_path = os.path.join(target_dir, filename)
            suffix_counter = 1
            while os.path.exists(target_file_path):
                pure_name, ext = os.path.splitext(filename)
                target_file_path = os.path.join(target_dir, f"{pure_name}_{suffix_counter}{ext}")
                suffix_counter += 1
            
            # 执行文件移动
            shutil.move(file_full_path, target_file_path)
            print(f"[完成] {filename} 已归档至 {fund_name} 文件夹")
        
        except Exception as e:
            # 其他未知错误统一移到异常文件夹
            shutil.move(file_full_path, os.path.join(ERROR_PATH, filename))
            print(f"[错误] 处理{filename}失败,已移至异常文件夹,错误原因:{str(e)}")
    
    print("全部文件处理完成")

进阶优化方向(按需添加即可)

  • 如果有个别基金名称本身包含-字符,导致拆分出错,可以提前写一个映射字典,把特殊的基金名和对应文件夹做绑定,拆分后做一次匹配替换即可,不需要改动整体逻辑。
  • 如果需要留归档记录,可以加几行代码,把每次归档的文件名、时间、目标路径写入一个csv日志文件,后续查档直接搜日志就行。
  • 后续可以加自动监听逻辑,脚本常驻后台,只要待归档文件夹里新增了文件,就自动触发分拣,连手动运行脚本的步骤都可以省掉。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 02:51:26