递归遍历子目录批量重命名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
关键修改说明
解决重命名顺序随机问题
- 新增
extract_number函数,从原文件名(如zero_000000000_keypoints.json)中提取数字部分,以此作为排序依据。 - 先收集所有目标文件,再通过
sort方法按提取的数字排序,彻底避免glob遍历的随机性。
- 新增
解决文件被移到根目录问题
- 使用
os.path.dirname(filename)获取原文件所在的子文件夹路径,生成新文件名时将其与新文件名拼接,确保重命名后的文件保留在原目录下。
- 使用
优化编号冲突处理
- 全局计数器
i确保所有文件编号连续且唯一,生成新文件名时检查是否已存在,避免重复命名。
- 全局计数器
内容的提问来源于stack exchange,提问作者abrar
相关产品推荐
相关产品推荐

