# -*- coding: utf-8 -*- """ 修复已有 meta.json: 枚举维度的空串 '' 必须是合法值(参考 KC magnet values=['','M'])。 原因: DomainValid 要求 enum 值在 values 内, 数据里大量型号该维度为空 → 判非法 → AllowedOptions 过滤后下拉全空 (用户反馈"只有 UCBP 能选, 其他都空")。 用法: PYTHONUTF8=1 python fix-clamp-meta-empty-enum.py """ import json, csv, os CAT = r'D:/开发/OnebotCatalog/onebot-data/catalog' SERIES = ['UCBP','UCBM','UCBT','UCBQ','UCBH','UCDP','UCIM','UCIP','UCNM','UCNP','UFL'] ENUM_CODES = ['pos', 'type', 'style', 'sensor'] DISPLAY_EMPTY = { 'pos': '不适用', 'type': '不适用', 'style': '不适用', 'sensor': '不适用', } for s in SERIES: mp = os.path.join(CAT, 'series', s + '.meta.json') with open(mp, encoding='utf-8') as f: meta = json.load(f) params = meta['series']['parameters'] changed = [] for p in params: if p['code'] not in ENUM_CODES: continue vals = p['values'] if '' in vals: continue # 从 CSV 确认该维度是否真有空值 cp = os.path.join(CAT, 'csv', s + '.csv') has_empty = False with open(cp, encoding='utf-8-sig') as f: for row in csv.DictReader(f): if p['code'] in row and (row[p['code']] or '') == '': has_empty = True break if not has_empty: continue p['values'] = [''] + vals d = p.get('display') or {} d[''] = DISPLAY_EMPTY.get(p['code'], '不适用') p['display'] = d changed.append(f"{p['code']}:{p['values']}") if changed: with open(mp, 'w', encoding='utf-8') as f: json.dump(meta, f, ensure_ascii=False, indent=1) print(f'[{s}] 补空值 -> {" | ".join(changed)}') else: print(f'[{s}] 无需修改')