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

递归遍历子目录批量重命名JSON文件的两个问题求助

问题修复方案

针对你遇到的两个问题,以下是修复后的代码及说明:

修复后的代码

import os
import glob
import re

src = r'/content/drive/MyDrive/Project/jsonfiles'
ext = '.json'

def extract_number(filename):
    # 从原文件名中提取用于排序的数字
    match = re.search(r'_(\d+)_keypoints', filename)
    return int(match.group(1)) if match else 0

# 收集所有需要重命名的文件,跳过已符合目标格式的文件
target_files = [
    f for f in glob.glob(os.path.join(src, '**/*' + ext), recursive=True)
    if not re.search(r'image_\d{5}_keypoints' + re.escape(ext) + r'$', f)
]

# 按原文件名中的数字排序,保证重命名顺序正确
target_files.sort(key=extract_number)

i = 0
for filename in target_files:
    # 获取原文件所在的子文件夹路径
    parent_dir = os.path.dirname(filename)
    # 生成不重复的新文件名,保留在原文件夹内
    while True:
        new_name = os.path.join(parent_dir, f'image_{i:05d}_keypoints{ext}')
        if not os.path.exists(new_name):
            break
        i += 1
    print(f'renaming "{filename}" to "{new_name}"...')
    os.rename(filename, new_name)
    i += 1

关键修改说明

  1. 解决重命名顺序随机问题

    • 新增extract_number函数,从原文件名(如zero_000000000_keypoints.json)中提取数字部分,以此作为排序依据。
    • 先收集所有目标文件,再通过sort方法按提取的数字排序,彻底避免glob遍历的随机性。
  2. 解决文件被移到根目录问题

    • 使用os.path.dirname(filename)获取原文件所在的子文件夹路径,生成新文件名时将其与新文件名拼接,确保重命名后的文件保留在原目录下。
  3. 优化编号冲突处理

    • 全局计数器i确保所有文件编号连续且唯一,生成新文件名时检查是否已存在,避免重复命名。

内容的提问来源于stack exchange,提问作者abrar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:50:38