如何使用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
相关产品推荐
相关产品推荐

