如何自动遍历列表项并执行专属操作:批量重命名图像序列文件
批量重命名多组图像序列文件
需求说明
目录下有以下多组图像序列文件:
- foo.1001.exr
- foo.1002.exr
- bar.1001.exr
- bar.1002.exr
需要给每个序列的文件名前缀添加_test,重命名后得到:
- foo_test.1001.exr
- foo_test.1002.exr
- bar_test.1001.exr
- bar_test.1002.exr
要求自动识别所有不同的序列前缀,适配任意数量的序列,避免文件覆盖。
当前问题
我已经能提取出所有唯一的序列前缀,但不知道如何自动遍历这些前缀来处理所有序列,以下是我的初始代码:
import os dir = "/test/" # File formats imageFileFormats = (".exr", ".dpx") fileName = [] for file in os.listdir(dir): for ext1 in imageFileFormats: if ext1 in file: fileName.append(file.split('.')[0]) newList = list(set(fileName)) newList.sort() for file in os.listdir(dir): for ext1 in imageFileFormats: if ext1 in file: if newList[0] in file: print (file)
解决方案
优化后的代码
import os target_dir = "/test/" image_formats = (".exr", ".dpx") # 提取所有唯一的序列前缀 prefixes = set() for filename in os.listdir(target_dir): # 仅处理指定格式的图像文件 if filename.lower().endswith(image_formats): # 按点分割文件名,确保结构是「前缀.帧号.扩展名」 parts = filename.split('.') if len(parts) >= 3: prefix = parts[0] prefixes.add(prefix) # 遍历每个前缀,批量重命名对应序列 for prefix in sorted(prefixes): for filename in os.listdir(target_dir): if filename.lower().endswith(image_formats) and filename.startswith(f"{prefix}."): parts = filename.split('.') frame_num = parts[-2] ext = parts[-1] # 构造新文件名 new_filename = f"{prefix}_test.{frame_num}.{ext}" # 拼接完整路径(适配不同系统) old_full_path = os.path.join(target_dir, filename) new_full_path = os.path.join(target_dir, new_filename) # 检查目标文件是否存在,防止覆盖 if not os.path.exists(new_full_path): os.rename(old_full_path, new_full_path) print(f"完成重命名: {filename} → {new_filename}") else: print(f"跳过操作: {new_filename} 已存在,避免覆盖")
代码改进点说明
- 更准确的格式判断:用
endswith替代in,避免文件名中间出现格式后缀导致的误判 - 自动遍历所有前缀:直接遍历
sorted(prefixes)集合,不管有多少组序列都能自动处理 - 安全重命名:重命名前检查目标文件是否存在,防止覆盖已有文件
- 路径兼容性:用
os.path.join拼接路径,适配Windows、Linux等不同操作系统 - 鲁棒性提升:增加文件名结构判断,避免异常格式的文件导致代码出错
内容的提问来源于stack exchange,提问作者Tim
相关产品推荐
相关产品推荐

