如何用Python匹配字段后获取JSON中对应其他字段的值
问题说明
现有JSON文件、TXT文件及一段Python代码,原代码仅能在TXT设备名称与JSON内termination_a.device.name匹配时打印名称,需修改代码实现匹配时输出对应JSON中的线缆URL(url)和接口URL(termination_a.url),并符合指定输出格式。
现有文件内容
1. JSON文件(test.json)
{ "results": [ { "url": "https://api.server.com/cables/100/", "termination_a": { "url": "https://api.server.com/interfaces/250/", "device": { "url": "https://api.server.com/devices/10/", "display": "device-number1-2023-08 myname (1718)", "name": "device-number1-2023-08 myname" } } }, { "url": "https://api.server.com/cables/200/", "termination_a": { "url": "https://api.server.com/interfaces/160/", "device": { "url": "https://api.server.com/devices/22/", "display": "device-number3-2023-08 myname (2245)", "name": "device-number3-2023-08 myname" } } }, { "url": "https://api.server.com/cables/300/", "termination_a": { "url": "https://api.server.com/interfaces/260/", "device": { "url": "https://api.server.com/devices/73/", "display": "device-number8-2023-08 myname (3678)", "name": "device-number8-2023-08 myname" } } } ] }
2. TXT文件(test.txt)
this is device-number1-2023-08 myname1 and it is good. this is device-number8-2023-08 myname8 and it is. this is device-number3-2023-08 myname3 and it is not good.
3. 原Python代码
import json with open('test.json', 'r') as j: data = json.load(j) with open('test.txt', 'r') as f: for ff in f.readlines(): ff = ff.split(' ') for jj in data['results']: jj_name = jj['termination_a']['device']['name'] ff_name = f'{ff[2]} {ff[3]}' if jj_name == ff_name: print(f'jj_name --> {jj_name}, ff_name --> {ff_name}')
修改后的代码
import json with open('test.json', 'r') as j: data = json.load(j) with open('test.txt', 'r') as f: for line in f.readlines(): # 提取TXT中的设备名称 parts = line.strip().split(' ') ff_name = f'{parts[2]} {parts[3]}' # 遍历JSON线缆条目 for item in data['results']: jj_name_base = item['termination_a']['device']['name'] # 适配名称差异:忽略TXT名称末尾的数字后缀 if ff_name.startswith(jj_name_base): cable_url = item['url'] interface_url = item['termination_a']['url'] # 按预期格式输出 print(f'jj_name --> {ff_name}, ii_name --> {ff_name}, url {cable_url}, [\'termination_a\'][\'url\'] --> {interface_url}')
关键调整说明
- 匹配逻辑修复:JSON与TXT中的设备名称仅末尾数字后缀不同,使用
startswith()实现模糊匹配,确保两者正确关联。 - URL提取:匹配成功后,直接从JSON条目中提取线缆URL和接口URL。
- 格式对齐:严格按照指定输出格式拼接字符串,与预期输出完全一致。
内容的提问来源于stack exchange,提问作者NomeEoleSem
相关产品推荐
相关产品推荐

