这个只是足够钝,没有典型的答案冒泡到顶部.
我正在使用的工具的性质决定了我们使用MongoDB来存储大约25种不同工具的"设置".每个工具都有自己的设置模式,因此每个文档都不同,但它们都存储在同一个集合中,并在json模式绘制的同一编辑页面上进行编辑.
我不知道字典的架构,我正在努力弄清楚如何迭代和消毒数据,特别是删除密码.
鉴于以下字典,并且知道其他dicts可能有不同的模式,我怎样才能遍历dict中的每个项目并创建一个副本,除了删除了任何密钥=="密码"之外?
所以:
{
"_enabled": true,
"instances": [
{
"isdefault": true,
"name": "dev",
"password": "abc123",
"url": "http://dev.example.com",
"user": "buffy"
},
{
"isdefault": false,
"name": "prod",
"password": "xxxxx",
"url": "http://prod.example.com",
"user": "spike"
},
{
"isdefault": false,
"name": "qa",
"password": "dasddf",
"url": "http://prod.example.com",
"user": "willow"
}
],
"label": "MyServers"
}
Run Code Online (Sandbox Code Playgroud)
应该导致:
{
"_enabled": true,
"instances": [
{
"isdefault": true,
"name": "dev",
"url": "http://dev.example.com",
"user": "buffy"
},
{
"isdefault": false,
"name": "prod",
"url": "http://prod.example.com",
"user": "spike"
},
{
"isdefault": false,
"name": "qa",
"url": "http://prod.example.com",
"user": "willow"
}
],
"label": "MyServers"
}
Run Code Online (Sandbox Code Playgroud)
首先深度复制字典,然后捕获所有字典并删除密码键:
from copy import deepcopy
def remove_pass(v):
if isinstance(v, dict):
if "password" in v:
del v["password"]
for ele in v.values():
remove_pass(ele)
elif isinstance(v, Iterable) and not isinstance(v, basestring):
for ele in v:
remove_pass(ele)
from pprint import pprint as pp
d = deepcopy(d)
for v in d.values():
remove_pass(v)
Run Code Online (Sandbox Code Playgroud)
输入:
{'_enabled': 'true',
'foo': {'isdefault': 'false',
'name': 'qa',
'nested': {'password': 'nested'},
'password': 'dasddf',
'url': 'http://prod.example.com',
'user': 'willow'},
'instances': [{'isdefault': 'true',
'name': 'dev',
'password': 'abc123',
'url': 'http://dev.example.com',
'user': 'buffy'},
{'isdefault': 'false',
'name': 'prod',
nested': {'more_nesting': {'even_more_nesting': ({'password': 'foobar'},
{'password': 'foob'}),
'password': 'bar'},
'password': 'xxxxx',
'url': 'http://prod.example.com',
'user': 'spike'},
{'isdefault': 'false',
'name': 'qa',
'password': 'dasddf',
'url': 'http://prod.example.com',
'user': 'willow'}],
'label': 'MyServers'}
Run Code Online (Sandbox Code Playgroud)
输出:
{'_enabled': 'true',
'foo': {'isdefault': 'false',
'name': 'qa',
'nested': {},
'url': 'http://prod.example.com',
'user': 'willow'},
'instances': [{'isdefault': 'true',
'name': 'dev',
'url': 'http://dev.example.com',
'user': 'buffy'},
{'isdefault': 'false',
'name': 'prod',
'nested': {'more_nesting': {'even_more_nesting': ({}, {})}},
'url': 'http://prod.example.com',
'user': 'spike'},
{'isdefault': 'false',
'name': 'qa',
'url': 'http://prod.example.com',
'user': 'willow'}],
'label': 'MyServers'}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
556 次 |
| 最近记录: |