Files
innovate_project/OpenCV/rename_files.py
2025-11-02 21:36:35 +08:00

111 lines
3.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
import re
import shutil
from tqdm import tqdm
# --- 配置参数 ---
# 1. 图片文件夹路径
image_folder = '../label/up'
# 2. 标注文件夹路径
annotation_folder = '../label/up_xml'
# 3. 新文件名的数字位数 (3 -> 000, 001, ...; 5 -> 00000, 00001, ...)
padding_zeros = 3
# --- 配置结束 ---
def rename_dataset_files(img_folder, an_folder, padding=3):
"""
重命名图片和标注文件l系列在前r系列在后按数字顺序排列。
"""
print("开始重命名任务...")
if not os.path.isdir(img_folder):
print(f"错误:图片文件夹 '{img_folder}' 不存在。")
return
if not os.path.isdir(an_folder):
print(f"错误:标注文件夹 '{an_folder}' 不存在。")
return
# 1. 获取所有图片文件名,并按 l 和 r 分组
l_files = []
r_files = []
other_files = []
for filename in os.listdir(img_folder):
if filename.lower().endswith('.jpg'):
base_name = os.path.splitext(filename)[0]
match = re.match(r'([lr])(\d+)', base_name, re.IGNORECASE)
if match:
prefix = match.group(1).lower()
number = int(match.group(2))
if prefix == 'l':
l_files.append((number, filename))
elif prefix == 'r':
r_files.append((number, filename))
else:
other_files.append(filename)
# 2. 对 l 和 r 组内的文件按数字进行排序
l_files.sort()
r_files.sort()
# 3. 合并文件列表l在前r在后
sorted_filenames = [f[1] for f in l_files] + [f[1] for f in r_files]
if not sorted_filenames:
print("在指定的 l/r 命名规则下未找到任何文件。")
if other_files:
print(f"跳过了这些文件: {other_files}")
return
print(f"找到 {len(sorted_filenames)} 个符合 l/r 规则的文件准备重命名。")
# 4. 开始重命名
counter = 0
with tqdm(total=len(sorted_filenames), desc="重命名文件") as pbar:
for old_filename in sorted_filenames:
# 构建新文件名
new_base_name = str(counter).zfill(padding)
new_jpg_name = f"{new_base_name}.jpg"
new_xml_name = f"{new_base_name}.xml"
# 构建旧文件的完整路径
old_base_name = os.path.splitext(old_filename)[0]
old_jpg_path = os.path.join(img_folder, f"{old_base_name}.jpg")
old_xml_path = os.path.join(an_folder, f"{old_base_name}.xml")
# 构建新文件的完整路径
new_jpg_path = os.path.join(img_folder, new_jpg_name)
new_xml_path = os.path.join(an_folder, new_xml_name)
# 执行重命名 (使用 shutil.move 更安全)
try:
if os.path.exists(old_jpg_path):
shutil.move(old_jpg_path, new_jpg_path)
else:
print(f"\n警告:找不到图片文件 {old_jpg_path}")
if os.path.exists(old_xml_path):
shutil.move(old_xml_path, new_xml_path)
else:
print(f"\n警告找不到XML文件 {old_xml_path}")
counter += 1
except Exception as e:
print(f"\n重命名文件 {old_filename} 时出错: {e}")
pbar.update(1)
print(f"\n重命名完成!共处理了 {counter} 对文件。")
if other_files:
print(f"注意:以下文件未被处理,因为它们不符合 l/r 命名规则: {other_files}")
if __name__ == '__main__':
rename_dataset_files(image_folder, annotation_folder, padding=padding_zeros)