Nic*_*ick 0 python sockets dictionary nested dynamic
首先,我知道这里有几个类似标题的问题,但没有一个问题是这样解释的,问题范围也不相同。
我想动态添加嵌套字典条目。
用例是:我有一个正在监视网络的 python 脚本。为每个观察到的 IP 协议(tcp、udp、icmp)创建一个字典。然后使用一个键创建一个子字典,该键是每个 IP 协议(80、443 等)的目标端口(如果存在)(请注意,它是否将服务器端口视为源端口并不重要)或目的地,但通常服务器是目的地,所以我选择 HTTP 和 HTTPS 作为示例)。对于每个目标端口,都会创建一个与服务器 IP(例如 www.google.com 的 IP)相对应的密钥。然后另一个字典,其中首先观察到的会话时间戳作为键,键的数据/值是客户端的 IP。
但是,我希望随着时间的推移需要填充它,因为我在执行之前和初始化时都没有数据。
输出看起来类似于:
{ 'icmp' :
{ 'echo-request' :
{ '<ip_of_www.google.com>' :
{ '<timestamp>' : <some_client_ip> }
}
'echo-reply' :
{ '<ip_of_www.google.com>' :
{ '<timestamp>' : <some_client_ip> }
}
}
'tcp' :
{
'80'
{ '<ip_of_www.google.com>' :
{ '<timestamp>' : <some_client_ip> }
{ '<timestamp>' : <some_client_ip> }
}
'443'
{ '<ip_of_encrypted.google.com>' :
{ '<timestamp>' : <some_client_ip> }
{ '<timestamp>' : <some_client_ip> }
{ '<timestamp>' : <some_client_ip> }
{ '<timestamp>' : <some_client_ip> }
}
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
给你:
def set_nested(dict, value, *path):
for level in path[:-1]:
dict = dict.setdefault(level, {})
dict[path[-1]] = value
d = {}
set_nested(d, '127.0.0.1', 'icmp', 'echo', 'google.com', '1 dec 2014')
set_nested(d, '127.0.0.1', 'icmp', 'echo', 'google.com', '2 dec 2014')
set_nested(d, '127.0.0.1', 'icmp', 'echo', 'yahoo.com', '2 dec 2014')
set_nested(d, 'error', 'udp')
from pprint import pprint
pprint(d)
Run Code Online (Sandbox Code Playgroud)
输出:
{'icmp': {'echo': {'google.com': {'1 dec 2014': '127.0.0.1',
'2 dec 2014': '127.0.0.1'},
'yahoo.com': {'2 dec 2014': '127.0.0.1'}}},
'udp': 'error'}
Run Code Online (Sandbox Code Playgroud)
如果您想存储和查询结果,我还建议您查看json
and 。tinydb