[英]How to extract only specific fields from a dictionary/json?
我正在嘗試創建一個新字典來僅提取特定字段,我只想要“process_hash”、“process_name”、“process_effective_reputation”字段。
下面的代碼可以工作,但它只提取第一個項目,我想提取所有項目,但僅適用於“process_hash”、“process_name”、“process_effective_reputation”字段
JSON:
{'results': [{'device_name': 'faaadc2',
'device_timestamp': '2020-10-27T00:50:46.176Z',
'event_id': '9b1bvfaa11eb81b',
'process_effective_reputation': 'LIST5',
'process_hash': ['bfc7dcf5935f3avda9df8e9b6425c37a',
'ca9f3a2450asd518fc939a33c100b2d557f96e040f712f6dd4641ad1734e2f19'],
'process_name': 'c:\\program files '
'(x86)\\to122soft\\thcaadf3\\tohossce.exe',
'process_username': ['JOHN\\user1']},
{'device_name': 'fk6saadc2',
'device_timestamp': '2020-10-27T00:50:46.176Z',
'event_id': '9b151f6e17ee11eb81b',
'process_effective_reputation': 'LIST1',
'process_hash': ['bfc7dcf5935f3a9df8e9baaa425c37a',
'ca9f3aaa506cc518fc939a33c100b2d557f96e040f712f6dd4641ad1734e2f19'],
'process_name': 'c:\\program files '
'(x86)\\oaaft\\tf3\\toaaotsice.exe',
'process_username': ['JOHN\\user2']},
{'device_name': 'sdddsdc2',
'device_timestamp': '2020-10-27T00:50:46.176Z',
'event_id': '9b151f698e11eb81b',
'process_effective_reputation': 'LIST',
'process_hash': ['9df8ebfc7dcf5935830f3a9b6asdcd7a',
'ca9f3a24506cc518fdfrcv39a33c100b2d557f96e040f7124641ad1734e2f19'],
'process_name': 'c:\\program files '
'(x86)\\toht\\thaa3\\toasce.exe',
'process_username': ['JOHN\\user3']}]}
代碼:
response = json.loads(r.text)
r = response['results']
selected_fields = []
for d in r:
selected_fields.append({k: d[k] for k in ("process_hash", "process_name", "process_effective_reputation")})
new_data = []
for data in selected_fields:
fieldnames = 'md5 sha256 process_name process_effective_reputation'.split()
row = {'md5': data['process_hash'][0], 'sha256': data['process_hash'][1]}
# Copy process_name and process_effective_reputation fields.
row.update({fieldname: data[fieldname] for fieldname in fieldnames[-2:]})
new_data.append(row)
return new_data
更新:
感謝 Lauren Boland 提供的代碼,這很有效,Nattelar 提供了解釋。
我附上了新代碼,我試圖將進程哈希字段拆分為兩個字段,以便它是“md5”“sha256”“process_name”“process_effective_reputation”,我已經嘗試了上面的代碼,但我得到了 row = {' md5': data['process_hash'][0], 'sha256': data['process_hash'][1]} IndexError: list index out of range
謝謝
您在 for 循環的每次迭代中都覆蓋了selected_fields
字典。
嘗試將其設為列表。 它將返回一個字典列表。
selected_fields = []
for d in r:
selected_fields.append({k: d[k] for k in ("process_hash", "process_name", "process_effective_reputation")})
return selected_fields
即使已經有了答案,我還是想指出這里發生了什么。
當您嘗試使變量等於某個值時,您最終會覆蓋之前存在的值,這就是您的代碼無法正常工作的原因。 但即使您嘗試使用 selected_fields.update() 它也不會起作用,因為鍵名稱相同,現在鍵的值將被覆蓋。
在做這種事情時,你通常必須保持結構的原始類型,在 selected_fields['Results'] 的情況下是一個列表
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.