import json from pathlib import Path # 直接导出一个全局映射,供其他脚本直接 import _DEFAULT_PATH = Path(__file__).with_name("city.json") def build_city_name_to_id(): """ 递归读取 city.json,生成 {name: id} 映射。 会遍历每个节点的 `sons` 字段(如存在)。 """ city_json_path = Path(_DEFAULT_PATH) raw = city_json_path.read_text(encoding="utf-8") data = json.loads(raw) name_to_id = {} def walk(nodes): for node in nodes: name = node.get("name") node_id = node.get("id") if name is not None and node_id is not None: # 若出现重名,后出现的会覆盖前面的值 name_to_id[str(name)] = int(node_id) sons = node.get("sons") or [] if sons: walk(sons) walk(data) return name_to_id def build_city_name_to_id_2(): city_json_path = Path(_DEFAULT_PATH) raw = city_json_path.read_text(encoding="utf-8") data_list = json.loads(raw) new_dict = {} for data in data_list: province = data["name"] province_id = data["id"] sons = data.get("sons") or [] for son in sons: city = son.get("name", "") city_id = son.get("id", "") new_dict[city] = {"province": province, "province_id": province_id, "city": city, "city_id": city_id} return new_dict def get_city(city_str): city_dict = build_city_name_to_id() province = "" city = "" if "北京" in city_str: city = "北京市" province = "北京" if "重庆" in city_str: city = "重庆市" province = "重庆" if "上海" in city_str: city = "上海市" province = "上海" if "天津" in city_str: city = "天津市" province = "天津" if "新疆" in city_str: province = "新疆维吾尔自治区" if "宁夏" in city_str: province = "宁夏回族自治区" if "内蒙古" in city_str: province = "内蒙古自治区" if "西藏" in city_str: province = "西藏自治区" if "广西" in city_str: province = "广西壮族自治区" for _city, _city_id in city_dict.items(): city_name = _city.replace("省", "").replace("市", "") if city_name in city_str and "省" in _city: if not province: province = _city if city_name in city_str and "市" in _city: if not city: city = _city city_id = province_id = 0 if city: city_id = city_dict[city] if province: province_id = city_dict[province] return city_id, province_id, city, province def get_city_2(city_str): """可以通过市获取省份""" city_dict = build_city_name_to_id_2() province = "" city = "" if "北京" in city_str: city = "北京市" province = "北京" if "重庆" in city_str: city = "重庆市" province = "重庆" if "上海" in city_str: city = "上海市" province = "上海" if "天津" in city_str: city = "天津市" province = "天津" if "新疆" in city_str: province = "新疆维吾尔自治区" if "宁夏" in city_str: province = "宁夏回族自治区" if "内蒙古" in city_str: province = "内蒙古自治区" if "西藏" in city_str: province = "西藏自治区" if "广西" in city_str: province = "广西壮族自治区" city_id = province_id = 0 for _city, _city_value in city_dict.items(): city_name = _city.replace("市", "") if city_name in city_str: # if not province: province = _city_value["province"] province_id = _city_value["province_id"] city = _city city_id = _city_value["city_id"] print(city_id, province_id, city, province) return city_id, province_id, city, province if __name__ == "__main__": city_id, province_id, city, province = get_city("香港") print(city_id, province_id, city, province) get_city_2("哈尔滨")