label_copy.py
python
import glob
import json
import os
from natsort import natsorted
def copy_labels_from_a_to_b(labels_to_copy, a_file='a.json', b_file='b.json'):
"""
从 a.json 中复制多个标签到 b.json
参数:
labels_to_copy: 要复制的标签名称列表
a_file: 源文件路径
b_file: 目标文件路径
"""
try:
# 读取源文件
with open(a_file, 'r', encoding='utf-8') as f:
data_a = json.load(f)
# 读取目标文件
with open(b_file, 'r', encoding='utf-8') as f:
data_b = json.load(f)
# 确保 b.json 中有 shapes 列表
if 'shapes' not in data_b:
data_b['shapes'] = []
total_copied = 0
# 查找并复制所有匹配的标签
for label in labels_to_copy:
shapes_to_copy = []
for shape in data_a.get('shapes', []):
if shape.get('label') == label:
shape_copy = shape.copy()
shapes_to_copy.append(shape_copy)
if shapes_to_copy:
data_b['shapes'].extend(shapes_to_copy)
total_copied += len(shapes_to_copy)
print(f"找到并复制 {len(shapes_to_copy)} 个 '{label}' 标签")
if total_copied > 0:
# 保存更新后的文件
with open(b_file, 'w', encoding='utf-8') as f:
json.dump(data_b, f, indent=4, ensure_ascii=False)
print(f"总计复制 {total_copied} 个标签到 {b_file}")
else:
print(f"在 {a_file} 中未找到指定的任何标签: {labels_to_copy}")
return total_copied
except Exception as e:
print(f"发生错误: {e}")
return 0
# 使用示例
if __name__ == "__main__":
# 复制单个标签
# copy_labels_from_a_to_b(['zhi'])
to_base=r"D:\data\jiezhi\det_1201\1201"
dirs=glob.glob(os.path.join(to_base, "*"))
dirs=[r"D:\data\jiezhi\det_1201\1201\20251201-201937"]
for to_dir in dirs:
dir_name=os.path.basename(to_dir)
from_dir=rf"D:\data\jiezhi\det_1201\zhi_from\{dir_name}"
json_from=glob.glob(os.path.join(from_dir, "*.json"))
json_from=natsorted(json_from)
json_to=glob.glob(os.path.join(to_dir, "*.json"))
json_to=natsorted(json_to)
for json_i, json_file in enumerate(json_from[:len(json_to)]):
json_to_path=json_to[json_i]
# 复制多个标签
copy_labels_from_a_to_b(['zhi'],a_file=json_file,b_file=json_to_path)
print(json_to_path)