簡體   English   中英

從嵌套的json文件中刪除python dict項

[英]Remove python dict item from nested json file

我有一個JSON文件,我從API返回KeyError:0,而我嘗試刪除python dict中的項目。 我認為這是我缺乏技巧和json格式的結合。

我的目標是從ip_address_1刪除192.168.1.1所有實例

我的代碼:

from api import Request
import requests, json, ordereddict

# prepare request
request = Request().service('').where({"query":"192.168.1.0"}).withType("json")

# call request
response = request.execute()

# parse response into python object
obj = json.loads(response)

# remove items
for i in xrange(len(obj)):
    if obj[i]["ip_address_1"] == "192.168.1.1":
        obj.pop(i)

# display
print json.dumps(obj,indent=1)

示例JSON:

{
 "response": {
  "alerts": [
   {
    "action": "New",
    "ip_address_1": "192.168.1.1",
    "domain": "example.com",
    "ip_address_2": "192.68.1.2"
   },
   {
    "action": "New",
    "ip_address_1": "192.168.1.3",
    "domain": "example2.com",
    "ip_address_2": "192.168.1.1"
   }
  ],
  "total": "2",
  "query": "192.168.1.0",
 }
}

這是不正確的:

# remove items
for i in xrange(len(obj)):
    if obj[i]["ip_address_1"] == "192.168.1.1":
        obj.pop(i)

您正在迭代對象,就像它是一個列表一樣。

你想做什么:

for sub_obj in obj["response"]["alerts"]:
    if sub_obj["ip_address_1"] == "192.168.1.1":
        sub_obj.pop("ip_address_1")

我已將您的要求解釋為:

  1. 從“警報”列表中刪除ip_address_1設置為192.168.1.1任何字典。
  2. 創建所有其他ip_address_1值的列表。

json.loads(response)生成這個字典:

{u'response': {u'alerts': [{u'action': u'New',
                            u'domain': u'example.com',
                            u'ip_address_1': u'192.168.1.1',
                            u'ip_address_2': u'192.68.1.2'},
                           {u'action': u'New',
                            u'domain': u'example2.com',
                            u'ip_address_1': u'192.168.1.3',
                            u'ip_address_2': u'192.168.1.1'}],
               u'query': u'192.168.1.0',
               u'total': u'2'}}

“警報”列表由(假設dict綁定到obj )訪問:

>>> obj['response']['alerts']
[{u'action': u'New',
  u'domain': u'example.com',
  u'ip_address_1': u'192.168.1.1',
  u'ip_address_2': u'192.68.1.2'},
 {u'action': u'New',
  u'domain': u'example2.com',
  u'ip_address_1': u'192.168.1.3',
  u'ip_address_2': u'192.168.1.1'}]

第一部分可以像這樣完成:

alerts = obj['response']['alerts']
obj['response']['alerts'] = [d for d in alerts if d.get('ip_address_1') != '192.168.1.1']

這里使用列表ip_address_1來過濾掉那些帶有ip_address_1 192.168.1.1的字典,然后生成的列表會反彈到obj字典中。 在此obj之后:

>>> pprint(obj)
{u'response': {u'alerts': [{u'action': u'New',
                            u'domain': u'example2.com',
                            u'ip_address_1': u'192.168.1.3',
                            u'ip_address_2': u'192.168.1.1'}],
               u'query': u'192.168.1.0',
               u'total': u'2'}}

接下來, 刪除不需要的dicts之后,如上所示,在警報列表上運行另一個列表解析,可以輕松創建其他IP地址的列表:

ip_addresses = [d['ip_address_1'] for d in obj['response']['alerts'] if d.get('ip_address_1') is not None]

請注意,我們使用get()來處理某些字典可能沒有ip_address_1鍵的可能性。

>>> ip_addresses
[u'192.168.1.3']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM