import json import os def load_jiancheng_data(): """加载简称映射数据""" # 获取JianCheng.json文件路径 jiancheng_path = os.path.join( os.path.dirname(os.path.dirname(__file__)), 'Dict', 'JianCheng.json' ) try: with open(jiancheng_path, 'r', encoding='utf-8') as f: data = json.load(f) except FileNotFoundError: print(f"错误:找不到文件 {jiancheng_path}") return {}, {} except json.JSONDecodeError: print(f"错误:{jiancheng_path} 文件格式不正确") return {}, {} # 创建简称和全称映射字典 abbrev_map = {} fullname_map = {} for item in data: abbrev = item.get('abbreviation') fullname = item.get('full_name') code = item.get('area_code') if abbrev and fullname and code: abbrev_map[abbrev] = {'full_name': fullname, 'area_code': code} fullname_map[fullname] = {'full_name': fullname, 'area_code': code} return abbrev_map, fullname_map def load_yunnan_area_data(): """加载云南省行政区划完整数据""" area_path = os.path.join( os.path.dirname(os.path.dirname(__file__)), 'Dict', '云南省行政区划数据.json' ) try: with open(area_path, 'r', encoding='utf-8') as f: data = json.load(f) except FileNotFoundError: print(f"错误:找不到文件 {area_path}") return {} except json.JSONDecodeError: print(f"错误:{area_path} 文件格式不正确") return {} # 递归遍历所有行政区划节点 area_map = {} def traverse_nodes(nodes): if isinstance(nodes, list): for node in nodes: traverse_nodes(node) elif isinstance(nodes, dict): # 提取名称和代码 name = nodes.get('name') code = nodes.get('code') or nodes.get('area_code') if name and code: area_map[name] = {'full_name': name, 'area_code': code} # 处理子节点 children = nodes.get('children') if children: traverse_nodes(children) traverse_nodes(data) return area_map def query_area_info(query_str): """ 查询行政区划信息(优化版) :param query_str: 简称或全称 :return: 包含full_name和area_code的字典,未找到返回None """ # 1. 先查简称映射表 if query_str in abbrev_map: return abbrev_map[query_str] # 2. 直接查询完整行政区划数据(新增) if query_str in yunnan_area_map: return yunnan_area_map[query_str] # 3. 最后查全称映射表 if query_str in fullname_map: return fullname_map[query_str] # 4. 尝试模糊匹配(新增) for name, info in yunnan_area_map.items(): if query_str in name or name in query_str: return info return None