如何使用python过滤嵌套的json文件?

2024-09-26 22:53:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试筛选嵌套的JSON文件。我想用fitering“classes”和“id”创建一个新的json文件。源JSON文件:

[
{"data": {"id": "ed", "label": "Executive Director (Harriet)"},
 "classes": "purple"  
 },

{"data": {"id": "vp1", "label": "Vice President (Sarah)"},
 "classes": "square"  
 },

{"data": {"id": "vp2", "label": "Vice President (Charlotte)"},
 "classes": "square"  
 },

{"data": {"id": "po1", "label": "Program Officer (Sojourner)"},
 "classes": "green diamond"  
 },

 {"data": {"id": "po2", "label": "Program Officer (Sojourner)"},
 "classes": "green diamond"  
 },
{"data": {"id": "pa", "label": "Program Associate (Ellen)"},
 "classes": "myimage"  
 }
 ]

我的目标是过滤'classes':'green diamond'拥有'id':'po1'。然后删除所有带有“绿色菱形”的类,除了“id”:“po1”

结果是:

[
{"data": {"id": "ed", "label": "Executive Director (Harriet)"},
 "classes": "purple"  
 },

{"data": {"id": "vp1", "label": "Vice President (Sarah)"},
 "classes": "square"  
 },

{"data": {"id": "vp2", "label": "Vice President (Charlotte)"},
 "classes": "square"  
 },

{"data": {"id": "po1", "label": "Program Officer (Sojourner)"},
 "classes": "green diamond"  
 },


{"data": {"id": "pa", "label": "Program Associate (Ellen)"},
 "classes": "myimage"  
 }]

我试图使用此代码获取数据,但出现错误:

import json

# Loding the data
with open("D:/bb.json", 'r') as file:
    content = file.read()

# Converting json_data to python dictionary format
json_data = json.loads(content)

quantite = -1  # -1 for not found case
for data in json_data[0]:

    # Checking for specific pair
    if data['classes'] == 'square' and data['id'] == 'vp2':
        print(data)
        break

如何过滤这样的json文件


Tags: 文件idjsondatavicegreenprogramlabel
2条回答

由于加载的json数据只是嵌套的list和dict,所以可以使用普通的list/dict操作;特别是,列表理解是有用的

import json

with open('input', 'r') as f:
    data = json.loads(f.read())

filtered = [x for x in data if not (x['classes'] == 'green diamond' and x['data']['id'] != 'po1')]

with open('output', 'w') as f:
    f.write(json.dumps(filtered, indent=2))

结果:

[
  {
    "data": {
      "id": "ed",
      "label": "Executive Director (Harriet)"
    },
    "classes": "purple"
  },
  {
    "data": {
      "id": "vp1",
      "label": "Vice President (Sarah)"
    },
    "classes": "square"
  },
  {
    "data": {
      "id": "vp2",
      "label": "Vice President (Charlotte)"
    },
    "classes": "square"
  },
  {
    "data": {
      "id": "po1",
      "label": "Program Officer (Sojourner)"
    },
    "classes": "green diamond"
  },
  {
    "data": {
      "id": "pa",
      "label": "Program Associate (Ellen)"
    },
    "classes": "myimage"
  }
]

尝试以下操作,对代码进行了一些更新

import json
# Loding the data
pathToFile = "bb.json"
with open(pathToFile, 'r') as file:
    content = file.read()
# Converting json_data to python dictionary format
json_data = json.loads(content)

removeEntryClass = "green diamond"
keepId = "po1"
outputList = []

for entry in json_data:
    if entry["classes"] == removeEntryClass and entry["data"]['id'] != keepId :
        continue
    outputList.append(entry)

print(outputList)
#You can save this list into jour file.. 

相关问题 更多 >

    热门问题