Python坐标命名文件排序异常问题及批量重命名需求
解决Python中{i,j}.png文件按Windows自然排序并重命名的问题
核心思路
默认字符串排序是按字符逐个比对,所以会出现1,10.png排在1,2.png前面的情况。我们需要从文件名里提取逗号分隔的横纵坐标整数(i和j),把这两个数值作为排序依据,就能实现先按i递增、再按j递增的Windows式排序逻辑。
具体实现代码
import os import glob # 1. 获取当前目录下所有{i,j}.png格式的文件 png_files = glob.glob("*.png") # 定义排序规则:提取文件名中的i和j并转为整数 def sort_key(filename): # 剥离后缀,拆分逗号分隔的两个数字 name_part = filename.split('.')[0] i_str, j_str = name_part.split(',') # 返回整数元组,排序时先比i、再比j return (int(i_str), int(j_str)) # 2. 按目标规则排序文件列表 sorted_files = sorted(png_files, key=sort_key) # 3. 批量重命名为Image0000001.png格式 for idx, old_path in enumerate(sorted_files, start=1): # 生成7位补零的序号文件名 new_name = f"Image{idx:07d}.png" os.rename(old_path, new_name) print(f"完成重命名:{old_path} → {new_name}")
关键细节说明
glob.glob("*.png"):快速匹配目标文件,若文件在子目录,修改为glob.glob("指定路径/*.png")即可。sort_key函数:这是实现正确排序的核心——将文件名中的字符串数字转为整数后,排序逻辑会优先按i的数值大小排列,i相同时再按j的数值排序,完全匹配Windows的自然排序。f"Image{idx:07d}.png":07d表示将序号格式化为7位数字,不足位数用前置零填充,确保重命名后的文件名仍能按序号正确排序。
额外注意事项
- 如果目录中有其他非{i,j}.png格式的png文件,建议先过滤避免报错:
valid_files = [] for file in png_files: name_part = file.split('.')[0] if ',' in name_part: try: # 验证是否能转成整数 int(name_part.split(',')[0]) int(name_part.split(',')[1]) valid_files.append(file) except ValueError: # 跳过格式错误的文件 pass sorted_files = sorted(valid_files, key=sort_key) - 重命名前建议先备份文件,防止意外操作导致文件丢失。
内容的提问来源于stack exchange,提问作者devtoform
相关产品推荐
相关产品推荐

