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

Python批量重命名仅替换文件名最后一个下划线插入fluid_mask的问题咨询

问题根因

你现有代码的错误来自两个不合理的设计:

  1. str.replace() 默认会替换全局所有匹配的字符,只要你取到的filename[-9]是下划线,就会把文件名里所有下划线都替换成目标字符串
  2. 硬编码取倒数第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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:15:03