如何按指定列表顺序为图片添加标签,实现正确重命名格式
解决图片重命名匹配标签的问题
问题根源
你的代码存在两个核心问题:
- 文件名拼接错误:直接将标签追加到原文件名后,保留了原有的
.png后缀,导致生成原文件名.png_标签.png的错误格式 - 文件顺序不匹配:
os.listdir()返回的文件是无序的,无法直接和标签列表按顺序一一对应,会出现标签与图片序号错位的情况
正确实现代码
import os import re # 你的标签列表 my_label = ["cat", "dog", "horse", "", ...] path = './images/folder/' # 筛选出文件夹内的所有png图片文件 image_files = [f for f in os.listdir(path) if f.endswith('.png') and os.path.isfile(os.path.join(path, f))] # 按文件名中的数字排序,保证image0、image2、image100按数字顺序排列 def get_image_num(filename): # 用正则提取文件名里的数字部分 num_match = re.search(r'image(\d+)\.png', filename) if num_match: return int(num_match.group(1)) return 0 # 处理异常文件名 image_files.sort(key=get_image_num) # 遍历排序后的文件与标签列表 for idx, filename in enumerate(image_files): # 跳过标签列表越界或空标签的情况(不需要可删除此判断) if idx >= len(my_label) or not my_label[idx]: continue # 拆分文件名和后缀,避免重复添加.png name_part, ext_part = os.path.splitext(filename) # 构造目标文件名格式 new_filename = f"{name_part}_{my_label[idx]}{ext_part}" # 拼接完整路径(适配不同系统路径分隔符) old_full_path = os.path.join(path, filename) new_full_path = os.path.join(path, new_filename) # 执行重命名 os.rename(old_full_path, new_full_path)
关键说明
- 排序逻辑:通过正则提取文件名中的数字,确保文件按数字序号排序,和标签列表的索引一一对应
- 文件名处理:使用
os.path.splitext()拆分文件名和后缀,彻底避免重复后缀问题 - 边界防护:增加了标签列表长度判断与空标签跳过逻辑,防止索引越界或生成无意义文件名
- 路径适配:用
os.path.join()拼接路径,比直接用字符串拼接更适配Windows、Linux等不同系统
内容的提问来源于stack exchange,提问作者semjad
相关产品推荐
相关产品推荐

