Sep-09-2021, 03:23 PM
(This post was last modified: Sep-09-2021, 03:23 PM by wardancer84.)
hi,
nested dict:
any clever ideas how to do this in a reuseable way? i tried list str.replace and dict key.pop methods which all failed.
nested dict:
'identity': {'AIX_REG_CLIENT_VER': '0.1-alpha', 'HOSTNAME': 'sag01147', 'SYSTEM_NAME': 'SAG01147_JBOSS4_HA'}, 'nodeinfo': {'CLUSTER_NAME': 'JBOSS4', 'CLUSTER_NODENAME': 'sag01147', 'CLUSTER_NODES': 'kug01147,sag01147', 'CLUSTER_RGS': 'JBOSS33,JBOSS34,JBOSS37,JBOSS38', 'CL_RGS': 'JBOSS38', 'CPU_ENTC': '0.60', 'CPU_VALUE': '4', 'HAS_COBOL': '0', 'HAS_JBOSS': '1', 'HAS_ORACLE': '0', 'HAS_SAP': '0', 'HAS_TUXEDO': '0', 'HAS_UC4': '0', 'HA_LEVEL': '7.2.4 SP2', 'IP': {'en0': '172.17.10.147', 'en1': '172.16.88.57', 'en2': '172.16.12.147'}, 'IP_LONG': {'en0': '172.17.10.147/255.255.248.0/172.17.15.255/', 'en1': '172.16.88.57/255.255.192.0/172.16.127.255/sag01147-ipl.some.domain', 'en2': '172.16.12.147/255.255.254.0/172.16.13.255/'}, 'IS_CLUSTER': '1', 'IS_LPM': '0', 'IS_ZPI': '0', 'IS_ZPV': '0', 'Java6': '6.0.0.655', 'Java6_64': '6.0.0.655', 'Java7': '7.0.0.665', 'Java7_64': '7.0.0.665', 'Java8_64': '8.0.0.610', 'LOCATION': 'Geiselberg', 'MACHINE_SERIAL': 'XXXXXX', 'MAN_SYS_NAME': 'GBG02', 'MEM_VALUE': '61440', 'OS_LEVEL': '7200-04-03-2038', 'STORAGE_VALUE': '258', 'UPTIME': '54', 'YUM_REPO': 'IBM'}, 'timestamp': {'DATETIME': '2021-09-09T17:04:32'}}the usuel flattening code:
for key, value in sample['nodeinfo'].items(): if isinstance(value, dict): for key, value in value.items(): entries.append([key, value]) else: entries.append([key, value]) print(entries)which produces this
[['HAS_COBOL', '0'], ['HAS_TUXEDO', '0'], ['HAS_SAP', '0'], ['HAS_ORACLE', '0'], ['IS_LPM', '0'], ['HAS_JBOSS', '1'], ['IS_ZPI', '0'], ['IS_ZPV', '0'], ['HAS_UC4', '0'], ['MEM_VALUE', '61440'], ['CPU_VALUE', '4'], ['STORAGE_VALUE', '258'], ['MAN_SYS_NAME', 'GBG02'], ['LOCATION', 'Geiselberg'], ['OS_LEVEL', '7200-04-03-2038'], ['UPTIME', '54'], ['MACHINE_SERIAL', 'XXXXX'], ['CPU_ENTC', '0.60'], ['YUM_REPO', 'IBM'], ['Java6', '6.0.0.655'], ['Java6_64', '6.0.0.655'], ['Java7', '7.0.0.665'], ['Java7_64', '7.0.0.665'], ['Java8_64', '8.0.0.610'], ['IS_CLUSTER', '1'], ['CLUSTER_NAME', 'JBOSS4'], ['CLUSTER_NODES', 'kug01147,sag01147'], ['CLUSTER_NODENAME', 'sag01147'], ['CLUSTER_RGS', 'JBOSS33,JBOSS34,JBOSS37,JBOSS38'], ['HA_LEVEL', '7.2.4 SP2'], ['CL_RGS', 'JBOSS38'], ['en0', '172.17.10.147'], ['en1', '172.16.88.57'], ['en2', '172.16.12.147'], ['en0', '172.17.10.147/255.255.248.0/172.17.15.255/'], ['en1', '172.16.88.57/255.255.192.0/172.16.127.255/sag01147-ipl.some.domain'], ['en2', '172.16.12.147/255.255.254.0/172.16.13.255/']]as the "en" stuff is only to keep dict keys unique, i need to replace them with the name of the containing dict, "IP" for example.
any clever ideas how to do this in a reuseable way? i tried list str.replace and dict key.pop methods which all failed.