python - 如何从字典/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: 列表索引超出范围
谢谢
解决方案
您在 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
推荐阅读
- callback - Keras 在每批后获取模型输出
- php - 为什么这个 PHP 代码在我的本地服务器上而不是在我的实时服务器上运行(本地 PHP 是 7.2 - Live 是 5.4)
- mobile - 如何从工作表上的按钮运行附加功能?
- python - 属性错误:在 Python 中将 hh:mm:ss 转换为十进制
- error-handling - 创建调用后显示后端错误消息
- c# - 在 VSTO 上下文中的主线程上运行任务
- java - 为什么这段代码没有正确执行?最长子串问题
- android - ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 什么都不做
- javascript - 未捕获的 SyntaxError:运行此代码时令牌无效或意外
- sqlite - 在 SQLITE3 中获取某个字符前后的字符串