city_name_to_id.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import json
  2. from pathlib import Path
  3. # 直接导出一个全局映射,供其他脚本直接 import
  4. _DEFAULT_PATH = Path(__file__).with_name("city.json")
  5. def build_city_name_to_id():
  6. """
  7. 递归读取 city.json,生成 {name: id} 映射。
  8. 会遍历每个节点的 `sons` 字段(如存在)。
  9. """
  10. city_json_path = Path(_DEFAULT_PATH)
  11. raw = city_json_path.read_text(encoding="utf-8")
  12. data = json.loads(raw)
  13. name_to_id = {}
  14. def walk(nodes):
  15. for node in nodes:
  16. name = node.get("name")
  17. node_id = node.get("id")
  18. if name is not None and node_id is not None:
  19. # 若出现重名,后出现的会覆盖前面的值
  20. name_to_id[str(name)] = int(node_id)
  21. sons = node.get("sons") or []
  22. if sons:
  23. walk(sons)
  24. walk(data)
  25. return name_to_id
  26. def build_city_name_to_id_2():
  27. city_json_path = Path(_DEFAULT_PATH)
  28. raw = city_json_path.read_text(encoding="utf-8")
  29. data_list = json.loads(raw)
  30. new_dict = {}
  31. for data in data_list:
  32. province = data["name"]
  33. province_id = data["id"]
  34. sons = data.get("sons") or []
  35. for son in sons:
  36. city = son.get("name", "")
  37. city_id = son.get("id", "")
  38. new_dict[city] = {"province": province, "province_id": province_id,
  39. "city": city, "city_id": city_id}
  40. return new_dict
  41. def get_city(city_str):
  42. city_dict = build_city_name_to_id()
  43. province = ""
  44. city = ""
  45. if "北京" in city_str:
  46. city = "北京市"
  47. province = "北京"
  48. if "重庆" in city_str:
  49. city = "重庆市"
  50. province = "重庆"
  51. if "上海" in city_str:
  52. city = "上海市"
  53. province = "上海"
  54. if "天津" in city_str:
  55. city = "天津市"
  56. province = "天津"
  57. if "新疆" in city_str:
  58. province = "新疆维吾尔自治区"
  59. if "宁夏" in city_str:
  60. province = "宁夏回族自治区"
  61. if "内蒙古" in city_str:
  62. province = "内蒙古自治区"
  63. if "西藏" in city_str:
  64. province = "西藏自治区"
  65. if "广西" in city_str:
  66. province = "广西壮族自治区"
  67. for _city, _city_id in city_dict.items():
  68. city_name = _city.replace("省", "").replace("市", "")
  69. if city_name in city_str and "省" in _city:
  70. if not province:
  71. province = _city
  72. if city_name in city_str and "市" in _city:
  73. if not city:
  74. city = _city
  75. city_id = province_id = 0
  76. if city:
  77. city_id = city_dict[city]
  78. if province:
  79. province_id = city_dict[province]
  80. return city_id, province_id, city, province
  81. def get_city_2(city_str):
  82. """可以通过市获取省份"""
  83. city_dict = build_city_name_to_id_2()
  84. province = ""
  85. city = ""
  86. if "北京" in city_str:
  87. city = "北京市"
  88. province = "北京"
  89. if "重庆" in city_str:
  90. city = "重庆市"
  91. province = "重庆"
  92. if "上海" in city_str:
  93. city = "上海市"
  94. province = "上海"
  95. if "天津" in city_str:
  96. city = "天津市"
  97. province = "天津"
  98. if "新疆" in city_str:
  99. province = "新疆维吾尔自治区"
  100. if "宁夏" in city_str:
  101. province = "宁夏回族自治区"
  102. if "内蒙古" in city_str:
  103. province = "内蒙古自治区"
  104. if "西藏" in city_str:
  105. province = "西藏自治区"
  106. if "广西" in city_str:
  107. province = "广西壮族自治区"
  108. city_id = province_id = 0
  109. for _city, _city_value in city_dict.items():
  110. city_name = _city.replace("市", "")
  111. if city_name in city_str:
  112. # if not province:
  113. province = _city_value["province"]
  114. province_id = _city_value["province_id"]
  115. city = _city
  116. city_id = _city_value["city_id"]
  117. print(city_id, province_id, city, province)
  118. return city_id, province_id, city, province
  119. if __name__ == "__main__":
  120. city_id, province_id, city, province = get_city("香港")
  121. print(city_id, province_id, city, province)
  122. get_city_2("哈尔滨")