如何基于文件名前缀批量重命名图片并重置分组编号
文件批量重命名编号重置问题解决
问题说明
批量重命名气象类图片文件时,出现编号无法按类型重置的问题:
- 原始文件分为Rain、Snow两类,每类各12组,每组包含Area4/5/6三个文件,文件名格式如
Rain.1699639200.Area4.png - 预期重命名后,Rain类从
Rain.00-06.Area*.png开始,最后一组为Rain.66-72.Area*.png;Snow类从Snow.00-06.Area*.png重新开始编号 - 当前代码执行后,Snow类会延续Rain类的编号,从
Snow.72-78.Area*.png开始,不符合预期
问题代码
imageFile = glob.glob("%s/*.png"%dataDir) imageFile.sort(key=os.path.getmtime) l = len(imageFile) j = 0 k = 6 m = 0 n = 6 p = 0 q = 6 for i in range(l): newimageName = imageFile[i] a, b, c, d = basename(newimageName).split('.') if a == "QPF*": if c == 'Area4': b = str(j)+"-"+str(k) os.rename(newimageName, dataDir + "/" + a + "." + b + "HR" + "." + c + "." + d) j += 6 k += 6 elif c == 'Area5': b = str(m)+"-"+str(n) os.rename(newimageName, dataDir + "/" + a + "." + b + "HR" + "." + c + "." + d) m += 6 n += 6 elif c == 'Area6': b = str(p)+"-"+str(q) os.rename(newimageName, dataDir + "/" + a + "." + b + "HR" + "." + c + "." + d) p += 6 q += 6 else: if c == 'Area4': b = str(j)+"-"+str(k) os.rename(newimageName, dataDir + "/" + a + "." + b + "HR" + "." + c + "." + d) j += 6 k += 6 elif c == 'Area5': b = str(m)+"-"+str(n) os.rename(newimageName, dataDir + "/" + a + "." + b + "HR" + "." + c + "." + d) m += 6 n += 6 elif c == 'Area6': b = str(p)+"-"+str(q) os.rename(newimageName, dataDir + "/" + a + "." + b + "HR" + "." + c + "." + d) p += 6 q += 6
问题根源
代码中的计数器j、k、m、n、p、q是全局变量,处理完Rain类所有文件后,这些计数器已累计到72。处理Snow类时未重置计数器,导致编号直接延续。
修复后的代码
import glob import os from os.path import basename imageFile = glob.glob("%s/*.png" % dataDir) imageFile.sort(key=os.path.getmtime) # 用字典统一管理各区域的编号计数器 counters = { 'Area4': {'start': 0, 'end': 6}, 'Area5': {'start': 0, 'end': 6}, 'Area6': {'start': 0, 'end': 6} } prev_file_type = None # 记录上一个文件的类型(Rain/Snow/QPF*) for file_path in imageFile: filename = basename(file_path) file_type, _, area, ext = filename.split('.') # 当文件类型切换时,重置所有区域的计数器 if file_type != prev_file_type: for area_key in counters: counters[area_key]['start'] = 0 counters[area_key]['end'] = 6 prev_file_type = file_type # 获取当前区域的起始/结束编号,补零为两位数 current_cnt = counters[area] new_range = f"{current_cnt['start']:02d}-{current_cnt['end']:02d}" # 构造新文件名 if file_type == "QPF*": new_filename = f"{file_type}.{new_range}HR.{area}.{ext}" else: new_filename = f"{file_type}.{new_range}HR.{area}.{ext}" # 执行重命名(用os.path.join避免路径分隔符问题) new_file_path = os.path.join(dataDir, new_filename) os.rename(file_path, new_file_path) # 更新当前区域的计数器 current_cnt['start'] += 6 current_cnt['end'] += 6
关键修改点
- 计数器按类型重置:新增
prev_file_type跟踪文件类型,类型切换时重置所有区域的计数器,保证Snow类从00-06开始编号 - 统一计数器管理:用字典
counters替代分散的变量,代码更简洁易维护 - 编号格式化:用
f"{num:02d}"将编号格式化为两位数,符合预期的00-06格式 - 路径安全拼接:使用
os.path.join拼接文件路径,避免不同系统下的路径分隔符问题
内容的提问来源于stack exchange,提问作者John K.
相关产品推荐
相关产品推荐

