加载数据

原始数据省市区.json参考:https://blog.csdn.net/itnerd/article/details/125627147

读取上述 json 文件

class AllCity:
    def __init__(self, json_file):
        self.dictionary = {}
        with open(json_file, 'r') as file:
            self.dictionary = json.load(file)
            
    def __query(self, jsonObj, key, field, exact=False):
        """
        该函数搜索json对象中所有满足字段field的值等于key的条目,
        允许模糊查找,结果存储于self.result_list中
        
        参数:
          jsonObj - 搜索的json对象
          key - 字符型,待匹配的值
          field - 字符型,查询的字段
          exact - 布尔型,是否精确匹配

        返回:
            无

        抛出异常:
            无
        """
        for f in jsonObj:
            if f == field:
                if exact:
                    if jsonObj[field] == key:
                        self.result_list.append(jsonObj)
                else:
                    if key in jsonObj[field]:
                        self.result_list.append(jsonObj)
            else:
                if isinstance(jsonObj[f], dict):
                    self.__query(jsonObj[f], key, field, exact)

                if isinstance(jsonObj[f], list):
                    for item in jsonObj[f]:
                        if isinstance(item, dict):
                            self.__query(item, key, field, exact)
            
    def query(self, key, field='name', exact=True):
        self.result_list = []
        self.__query(self.dictionary, key, field, exact)
        return self.result_list
        
        
ac = AllCity('省市区.json')

模糊查询

ac.query('吉县', field='name', exact=False)
'''
[{'code': 141028, 'name': '吉县'},
 {'code': 220221, 'name': '永吉县'},
 {'code': 330523, 'name': '安吉县'},
 {'code': 542525, 'name': '革吉县'},
 {'code': 640422, 'name': '西吉县'}]
'''

pc.query('河区', field='name', exact=False)
'''
[{'code': 120117, 'name': '宁河区'},
 {'code': 130304, 'name': '北戴河区'},
 {'code': 130903, 'name': '运河区'},
 {'code': 150202, 'name': '东河区'},
 {'code': 150802, 'name': '临河区'},
 {'code': 210103, 'name': '沈河区'},
 {'code': 210703, 'name': '凌河区'},
 {'code': 210911, 'name': '细河区'},
 {'code': 211011, 'name': '太子河区'},
 {'code': 211204, 'name': '清河区'},
 {'code': 230306, 'name': '城子河区'},
 {'code': 230711, 'name': '乌马河区'},
 {'code': 230712, 'name': '汤旺河区'},
 {'code': 230904, 'name': '茄子河区'},
 {'code': 340111, 'name': '包河区'},
 {'code': 410411, 'name': '湛河区'},
 {'code': 411502, 'name': '浉河区'},
 {'code': 440106, 'name': '天河区'},
 {'code': 511113, 'name': '金口河区'},
 {'code': 620103, 'name': '七里河区'},
 {'code': 650106, 'name': '头屯河区'}]
'''

精确查询

pc.query('吉县', field='name', exact=True)
'''
[{'code': 141028, 'name': '吉县'}]
'''

pc.query(141027, field='code', exact=True)
'''
[{'code': 141027, 'name': '浮山县'}]
'''

pc.query('北京市', field='name', exact=True)
'''
[{'code': 110000,
  'name': '北京市',
  'list': [{'code': 110101, 'name': '东城区'},
   {'code': 110102, 'name': '西城区'},
   {'code': 110105, 'name': '朝阳区'},
   {'code': 110106, 'name': '丰台区'},
   {'code': 110107, 'name': '石景山区'},
   {'code': 110108, 'name': '海淀区'},
   {'code': 110109, 'name': '门头沟区'},
   {'code': 110111, 'name': '房山区'},
   {'code': 110112, 'name': '通州区'},
   {'code': 110113, 'name': '顺义区'},
   {'code': 110114, 'name': '昌平区'},
   {'code': 110115, 'name': '大兴区'},
   {'code': 110116, 'name': '怀柔区'},
   {'code': 110117, 'name': '平谷区'},
   {'code': 110118, 'name': '密云区'},
   {'code': 110119, 'name': '延庆区'}]}]
'''
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐