使用递归函数,获取多维嵌套字典所有层级的key和value,且key带路径
取深层的value值,并把key值得每一层都显示,例如下文中的测试字典raw_dict的server-addr
展示为spring.cloud.nacos.discovery.server-addr': 'nacos.al:8848'
实现代码如下
raw_dict={
'spring': {
'cloud': {
'nacos': {
'discovery': {
'server-addr': 'nacos.al:8848'
}
}
},
'datasource': {
'url': 'jdbc:mysql://rm-3ns202ceq03dayyg8.mysql.rds.aliyuncs.com:3306/xxx?useUnicode=true&characterEncoding=utf8&useSSL=false',
'username': 'app',
'password': '123456'
}
},
'dubbo': {
'registry': {
'address': 'nacos://nacos.al:8848'
}
},
'custom-config': {
'bill-config': {
'extension-config': {
'extensionMultiPrepaymentRNVersion': 200,
'multiCashInstallmentByRNVersion': 502,
'extensionInstallment2PDL': 200
},
'grayscaleNewVersionTagId': 6463
},
'credit-config': {
'cash-loan-config': {
'blacklist': []
},
'cash-installment-config': {
'blacklist': []
}
},
'financial-page-config': {
'newVersion4NotLogin': True,
'newVersion4AllLogin': True,
'newVersionTailNumberSet': [0, 1, 2, 3, 4, 5, 7, 8, 9]
},
'repayment-config': {
'combinerRepayDisabledTagId': 5905
},
'payCenterConfigMap': {
'afi': {
'bizCode': 'afiRP',
'secretKey': '112233445566'
}
}
},
'asetku': {
'loan': {
'host': 'http://test.supermarket'
}
},
'kms': {
'appId': 'xxx',
'token': '12f3b4b5-678d-9cec-af12-dc12e34f5ad6'
}
}
class AnalyzeDataUtil:
def __init__(self, datas):
self.datas = datas
def analyze_data(self, data, result="raw_dict"):
"""多维/嵌套字典数据无限遍历,获取所有key层和value
:param data:
:param result:
:return:
"""
if isinstance(data, dict): #使用isinstance检测数据类型:字典类型
for k,v in data.items():
self.analyze_data(v, result+".%s" %str(k))
elif isinstance(data,(list, tuple)): #列表或元组类型
for i in range(len(data)):
self.analyze_data(data[i], result+"[%s]" %i) # 自我调用实现无限遍历
else:
# print(result + "=" + str(data))
self.datas[result] = str(data)
if __name__ == '__main__':
t = AnalyzeDataUtil({}) # 传入空字典{},即datas初始值为{}
t.analyze_data(raw_dict,result="raw_dict") #执行过程
print(t.datas) # 最终需要的是类属性datas
返回结果如下
{'raw_dict.spring.cloud.nacos.discovery.server-addr': 'nacos.al:8848',
'raw_dict.spring.datasource.url': 'jdbc:mysql://rm-3ns202ceq03dayyg8.mysql.rds.aliyuncs.com:3306/personal_service?useUnicode=true&characterEncoding=utf8&useSSL=false',
'raw_dict.spring.datasource.username': 'app',
'raw_dict.spring.datasource.password': '123456',
'raw_dict.dubbo.registry.address': 'nacos://nacos.al:8848',
'raw_dict.custom-config.bill-config.extension-config.extensionMultiPrepaymentRNVersion': '200', 'raw_dict.custom-config.bill-config.extension-config.multiCashInstallmentByRNVersion': '502', 'raw_dict.custom-config.bill-config.extension-config.extensionInstallment2PDL': '200',
'raw_dict.custom-config.bill-config.grayscaleNewVersionTagId': '6463',
'raw_dict.custom-config.financial-page-config.newVersion4NotLogin': 'True',
'raw_dict.custom-config.financial-page-config.newVersion4AllLogin': 'True',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[0]': '0',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[1]': '1',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[2]': '2',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[3]': '3',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[4]': '4',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[5]': '5',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[6]': '7',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[7]': '8',
'raw_dict.custom-config.financial-page-config.newVersionTailNumberSet[8]': '9',
'raw_dict.custom-config.repayment-config.combinerRepayDisabledTagId': '5905',
'raw_dict.custom-config.payCenterConfigMap.afi.bizCode': 'afiRP',
'raw_dict.custom-config.payCenterConfigMap.afi.secretKey': '112233445566',
'raw_dict.asetku.loan.host': 'http://test.supermarket',
'raw_dict.kms.appId': 'xxx',
'raw_dict.kms.token': '12f3b4b5-678d-9cec-af12-dc12e34f5ad6'}