Python批量重命名仅替换文件名最后一个下划线插入fluid_mask的问题咨询
问题根因
你现有代码的错误来自两个不合理的设计:
str.replace()默认会替换全局所有匹配的字符,只要你取到的filename[-9]是下划线,就会把文件名里所有下划线都替换成目标字符串- 硬编码取倒数第9位字符作为替换目标,完全依赖文件名固定长度,只要文件名长度变化就会出现逻辑错误,鲁棒性极低
解决思路
不需要依赖固定索引定位下划线,直接使用Python字符串的rsplit()方法从右侧分割1次下划线,即可精准定位到最后一个下划线的位置,拼接插入_fluid_mask_就能实现需求,适配任意长度的带下划线文件名。
修正后的完整代码
import os import shutil from tqdm import tqdm src = r"C:\Users\cetinh\Desktop\New folder (7)" dest = r"C:\Users\cetinh\Desktop\New folder (8)" for filename in tqdm(os.listdir(src), position=0, leave=True, dynamic_ncols=True, desc="Total"): file_path = os.path.join(src, filename) # 跳过目录,只处理文件 if not os.path.isfile(file_path): continue # 分离文件名主体和后缀,避免后缀中的下划线被误处理 base_name, ext = os.path.splitext(filename) # 从右往左仅分割1次下划线 parts = base_name.rsplit('_', 1) # 处理没有下划线的异常情况 if len(parts) < 2: tqdm.write(f"Skipping {filename}: no underscore found") continue # 拼接生成新文件名 new_base = f"{parts[0]}_fluid_mask_{parts[1]}" new_filename = new_base + ext dest_path = os.path.join(dest, new_filename) if os.path.exists(dest_path): tqdm.write(f"Skipping {filename}") continue # 直接移动时改名,省去中间重命名步骤效率更高 shutil.move(file_path, dest_path) tqdm.write(f"Copying {filename} -----> {new_filename}")
效果验证
用你给出的示例文件名840624002_OS_V9_20170310_0102.png测试,处理后得到的新文件名为840624002_OS_V9_20170310_fluid_mask_0102.png,完全符合仅替换最后一个下划线的需求。
内容的提问来源于stack exchange,提问作者hascet33
相关产品推荐
相关产品推荐

