#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 标签点位名称映射模块 从CSV文件中读取TagName到中文Description的映射关系 """ import csv import os import logging from pathlib import Path logger = logging.getLogger(__name__) # 全局缓存 _tag_name_map = {} _tag_description_cache_loaded = False def load_tag_name_map(csv_dir=None): """ 从CSV文件加载标签名称映射 :param csv_dir: CSV文件目录,默认为 ../name/ :return: dict {TagName: Description} """ global _tag_name_map, _tag_description_cache_loaded if _tag_description_cache_loaded: return _tag_name_map if csv_dir is None: # 默认 CSV 目录:相对于本项目目录的 ../name/ base_dir = Path(__file__).parent csv_dir = base_dir.parent / 'name' csv_dir = Path(csv_dir) if not csv_dir.exists(): logger.warning(f"标签名称CSV目录不存在: {csv_dir}") _tag_description_cache_loaded = True return _tag_name_map _tag_name_map = {} csv_files = list(csv_dir.glob('*.csv')) for csv_file in csv_files: try: with open(csv_file, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) count = 0 for row in reader: tag_name = row.get('TagName', '').strip() description = row.get('Description', '').strip() if tag_name and description: _tag_name_map[tag_name] = description count += 1 logger.info(f"从 {csv_file.name} 加载 {count} 个标签名称映射") except Exception as e: logger.error(f"读取CSV文件失败 {csv_file}: {e}") _tag_description_cache_loaded = True logger.info(f"标签名称映射加载完成,共 {len(_tag_name_map)} 个标签") return _tag_name_map def get_tag_description(tag_name): """ 获取标签的中文描述 :param tag_name: 标签英文名称 :return: 中文描述,如果找不到则返回原标签名 """ global _tag_name_map, _tag_description_cache_loaded if not _tag_description_cache_loaded: load_tag_name_map() if tag_name in _tag_name_map: return _tag_name_map[tag_name] # 尝试模糊匹配 - 提取短名称 if '.' in tag_name: short_name = tag_name.split('.')[-1] if short_name in _tag_name_map: return _tag_name_map[short_name] # 返回原名称 return tag_name def get_all_tag_names(): """获取所有已加载的标签名称映射""" global _tag_description_cache_loaded if not _tag_description_cache_loaded: load_tag_name_map() return _tag_name_map.copy() def enrich_data_with_names(data): """ 为数据列表添加中文名称字段 :param data: 数据列表,每个元素包含 tag_full_name / tag_name / tag_short_name :return: 添加了 chinese_name 字段的数据列表 """ global _tag_description_cache_loaded if not _tag_description_cache_loaded: load_tag_name_map() enriched = [] for item in data: item_copy = item.copy() # 优先使用 tag_full_name(完整标签名)匹配CSV中的TagName # 因为CSV名称映射文件中的TagName是完整标签名(含前缀) tag_name = ( item.get('tag_full_name') or item.get('tag_name') or item.get('TagName') or item.get('tag') or item.get('tag_short_name') or '' ) chinese_name = get_tag_description(tag_name) item_copy['chinese_name'] = chinese_name enriched.append(item_copy) return enriched # 应用启动时预加载 def init_for_app(app=None): """ 在Flask应用启动时预加载标签名称映射 """ logger.info("正在预加载标签名称映射...") tag_map = load_tag_name_map() logger.info(f"标签名称映射预加载完成: {len(tag_map)} 个标签") # 如果提供了Flask应用,将映射加入配置 if app: app.config['TAG_NAME_MAP'] = tag_map