使用 python 访问 JSON 文件中的属性并过滤属性与特定值匹配的项目
Access attributes in JSON file with python and filter items which attribute matches to specific value
我有 JSON 个文件 (list.json) 作为输入:
"Module1": {
"Description": "",
"Layer": "1",
},
"Vendor": ""
},
"Module2": {
"Description": "",
"Layer": "2",
},
"Vendor": ""
},
"Module3": {
"Description": "",
"Layer": "3",
},
"Vendor": ""
},
"Module1": 4
"Description": "",
"Layer": "4",
},
"Vendor": ""
},
如果“Vendor”符合某些条件,我将尝试提取所有模块(它们的名称),在这种情况下,应打印所有带有“Vendor”:“comp”的模块(Module2、Module3)。
我的代码是:
导入 json
list_components = []
with open (/list.json) as f:
swc_list = json.load(f)
for i in swc_list:
if i['Vendor'] == 'comp':
list_components.append(i)
print (list_components)
当我 运行 此代码时,我不断收到: string indices must be integers
在线 if i['Vendor'] == 'comp':
执行此操作的最佳方法是什么?
您只是错过了一个事实,即您的模块字典是一个嵌套字典。每个模块描述本身就是一个字典。
要遍历您的模块(字典的键),您必须使用 .keys() 或 .items() 方法。然后您可以访问每个内部词典。
list_components = []
#iterate through the keys of swc_list
for k in swc_list.keys():
if swc_list[k]['Vendor'] == 'comp':
list_components.append(k)
print (list_components)
编辑:
如果你想获取不同模块的属性,你只需要使用它们在内部字典中的键来访问它们。
通过指定您想要的字典属性,您可以访问它的值。
swc_list['Module1']
会给你第一个模块的完整描述字典
{
"Description": "",
"Layer": "1",
"Vendor": "",
}
swc_list['Module1']['Layer']
只会为您提供与第一个模块的 Layer 参数关联的值
list_components = []
for k in swc_list.keys():
if swc_list[k]['Vendor'] == 'comp':
#instead of keeping only the main key (Module) you can append a tuple containing the Module and its attribute Layer
list_components.append((k,swc_list[k]['Layer']))
print (list_components)
>>>[('Module2', '1'), ('Module3', '1')]
您不需要在此处过滤列表,而是需要过滤字典,因为您的模块存储在 JSON 对象中。
你可以使用 Python 字典推导来完成这种工作:
target_modules = dict((key, val) for key, val in json_data.items() if val['Vendor'] == 'comp')
print(target_modules)
我有 JSON 个文件 (list.json) 作为输入:
"Module1": {
"Description": "",
"Layer": "1",
},
"Vendor": ""
},
"Module2": {
"Description": "",
"Layer": "2",
},
"Vendor": ""
},
"Module3": {
"Description": "",
"Layer": "3",
},
"Vendor": ""
},
"Module1": 4
"Description": "",
"Layer": "4",
},
"Vendor": ""
},
如果“Vendor”符合某些条件,我将尝试提取所有模块(它们的名称),在这种情况下,应打印所有带有“Vendor”:“comp”的模块(Module2、Module3)。
我的代码是: 导入 json
list_components = []
with open (/list.json) as f:
swc_list = json.load(f)
for i in swc_list:
if i['Vendor'] == 'comp':
list_components.append(i)
print (list_components)
当我 运行 此代码时,我不断收到: string indices must be integers
在线 if i['Vendor'] == 'comp':
执行此操作的最佳方法是什么?
您只是错过了一个事实,即您的模块字典是一个嵌套字典。每个模块描述本身就是一个字典。
要遍历您的模块(字典的键),您必须使用 .keys() 或 .items() 方法。然后您可以访问每个内部词典。
list_components = []
#iterate through the keys of swc_list
for k in swc_list.keys():
if swc_list[k]['Vendor'] == 'comp':
list_components.append(k)
print (list_components)
编辑:
如果你想获取不同模块的属性,你只需要使用它们在内部字典中的键来访问它们。 通过指定您想要的字典属性,您可以访问它的值。
swc_list['Module1']
会给你第一个模块的完整描述字典
{
"Description": "",
"Layer": "1",
"Vendor": "",
}
swc_list['Module1']['Layer']
只会为您提供与第一个模块的 Layer 参数关联的值
list_components = []
for k in swc_list.keys():
if swc_list[k]['Vendor'] == 'comp':
#instead of keeping only the main key (Module) you can append a tuple containing the Module and its attribute Layer
list_components.append((k,swc_list[k]['Layer']))
print (list_components)
>>>[('Module2', '1'), ('Module3', '1')]
您不需要在此处过滤列表,而是需要过滤字典,因为您的模块存储在 JSON 对象中。
你可以使用 Python 字典推导来完成这种工作:
target_modules = dict((key, val) for key, val in json_data.items() if val['Vendor'] == 'comp')
print(target_modules)