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
相关产品推荐
相关产品推荐

