import pandas as pd from typing import List, Optional, Dict, Tuple import os class AreaCodeTool: def __init__(self, csv_path: str = None): """ 初始化行政区划代码工具 Args: csv_path: CSV文件路径,如果为None则使用默认路径 """ if csv_path is None: # 获取当前文件所在目录 current_dir = os.path.dirname(os.path.abspath(__file__)) csv_path = os.path.join(current_dir, "area_code.csv") # 读取CSV文件 self.df = pd.read_csv(csv_path, dtype={'code': str}) # 确保code列为字符串类型 self.df['code'] = self.df['code'].astype(str) # 构建区域名称到代码的映射 self._build_name_maps() def _build_name_maps(self): """构建区域名称到代码的映射""" self.full_name_map = dict(zip(self.df['name'], self.df['code'])) # 构建省级映射 self.province_map = {} # 构建市级映射 self.city_map = {} # 构建区县级映射 self.district_map = {} for _, row in self.df.iterrows(): name = row['name'].strip() code = row['code'] parts = name.split('省' if '省' in name else '市') if '省' in name: province = parts[0] + '省' self.province_map[province] = code if len(parts) > 1 and parts[1]: city_parts = parts[1].split('市') if city_parts[0]: city = city_parts[0] + '市' self.city_map[city] = code if len(city_parts) > 1 and city_parts[1]: district = city_parts[1] self.district_map[district] = code else: # 处理直辖市等特殊情况 if parts[0]: self.city_map[parts[0] + '市'] = code def find_code(self, area_name: str) -> List[Tuple[str, str]]: """ 查找区域代码 Args: area_name: 区域名称,可以是完整或部分名称 Returns: List[Tuple[str, str]]: 返回匹配的(区域名称, 代码)列表 """ results = [] # 尝试完整匹配 if area_name in self.full_name_map: results.append((area_name, self.full_name_map[area_name])) return results # 尝试省级匹配 if area_name.endswith('省') and area_name in self.province_map: results.append((area_name, self.province_map[area_name])) # 尝试市级匹配 if area_name.endswith('市') and area_name in self.city_map: results.append((area_name, self.city_map[area_name])) # 尝试区县级匹配 if area_name in self.district_map: results.append((area_name, self.district_map[area_name])) # 模糊匹配 if not results: mask = self.df['name'].str.contains(area_name, na=False) matches = self.df[mask] results.extend([(row['name'], row['code']) for _, row in matches.iterrows()]) return results def get_full_name(self, code: str) -> Optional[str]: """ 根据代码获取完整的区域名称 Args: code: 区域代码 Returns: Optional[str]: 完整的区域名称,如果未找到则返回None """ mask = self.df['code'] == code matches = self.df[mask] if not matches.empty: return matches.iloc[0]['name'] return None # 使用示例 def example_usage(): tool = AreaCodeTool() # 测试不同类型的查询 test_cases = [ "安徽省", "安庆市", "迎江区", "安徽省安庆市", "安徽省安庆市迎江区", "安庆" # 模糊查询 ] for query in test_cases: print(f"\n查询: {query}") results = tool.find_code(query) for name, code in results: print(f"匹配结果: {name} -> {code}") # 测试代码反查 code = "340802" # 安徽省安庆市迎江区 full_name = tool.get_full_name(code) if full_name: print(f"\n代码反查: {code} -> {full_name}") if __name__ == "__main__": example_usage()