You need to enable JavaScript to run this app. Python与Pandas基于Excel映射表批量重命名文件夹的精确匹配实现
优惠活动
大模型
产品
解决方案
定价
更多

Python与Pandas基于Excel映射表批量重命名文件夹的精确匹配实现

问题根因

原代码使用pandas.Series.str.match做匹配的逻辑不符合精确匹配需求:该接口仅校验字符串是否以目标内容为开头,不会强制要求两个字符串完全相等,碰到"XENON"、"XENON2"、"XENON2A"这类前缀高度相似的条目时,会一次性匹配到多个结果,最终取到错误的映射值,叠加dirs_exist_ok=True的合并写入特性,就会出现多个原文件夹内容被错误合并的异常。

修正实现方案

相比逐次遍历过滤DataFrame的写法,把映射表转成Python原生字典的实现效率更高,也天然支持精确等值匹配,适配1200余条映射的场景完全没有性能压力,同时增加异常分支避免流程中断:

import pandas as pd
import os
import shutil

workdir = r'D:\Python\Jupyter Notebooks\work\final_name\games'
targetdir = r'D:\Python\Jupyter Notebooks\work\final_name\fin'

# 读取映射表,直接生成 原文件夹名:规范新名 的映射字典
mapping_df = pd.read_excel('hdd_games.xlsx', usecols=['name_folder', 'name_game'])
# 提前清洗字段,去除首尾不可见空格,避免隐形匹配失败
mapping_df['name_folder'] = mapping_df['name_folder'].astype(str).str.strip()
name_map = dict(zip(mapping_df['name_folder'], mapping_df['name_game']))

# 遍历工作目录下的所有文件夹
for folder_name in os.listdir(workdir):
    current_folder_path = os.path.join(workdir, folder_name)
    # 跳过非文件夹的内容
    if not os.path.isdir(current_folder_path):
        continue
    # 精确匹配映射条目
    if folder_name not in name_map:
        print(f"跳过:未找到文件夹 {folder_name} 对应的映射关系")
        continue
    new_name = name_map[folder_name]
    new_target_path = os.path.join(targetdir, new_name)
    shutil.copytree(current_folder_path, new_target_path, dirs_exist_ok=True)
    print(f"已完成 {folder_name} -> {new_name} 的内容复制")
场景适配优化建议
  • 可在生成映射字典前增加重复键校验:如果Excel映射表中存在多个相同的原始文件夹名,字典生成时会自动覆盖旧值,提前校验可以避免映射逻辑失效
  • 如果不需要保留原文件夹内容,可将shutil.copytree替换为shutil.move,减少磁盘重复存储的开销
  • 可以在代码执行前加一步目标目录存在性检查:如果目标目录已经存在同名文件夹,可配置跳过逻辑,避免历史内容被新复制的内容覆盖合并

注意:即使给str.match方法加上全字符串匹配的正则锚点修正逻辑,在该静态映射场景下,字典查找的实现可读性、执行效率都远高于反复遍历过滤DataFrame的方案。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 13:06:08