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

如何基于文件名前缀批量重命名图片并重置分组编号

文件批量重命名编号重置问题解决

问题说明

批量重命名气象类图片文件时,出现编号无法按类型重置的问题:

  • 原始文件分为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

关键修改点

  1. 计数器按类型重置:新增prev_file_type跟踪文件类型,类型切换时重置所有区域的计数器,保证Snow类从00-06开始编号
  2. 统一计数器管理:用字典counters替代分散的变量,代码更简洁易维护
  3. 编号格式化:用f"{num:02d}"将编号格式化为两位数,符合预期的00-06格式
  4. 路径安全拼接:使用os.path.join拼接文件路径,避免不同系统下的路径分隔符问题

内容的提问来源于stack exchange,提问作者John K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:38:14