使用 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)