如何从文件路径列表生成python字典

时间:2019-03-12 14:28:52

标签: python boto3

我正在使用this SSM方法从我的AWS参数存储中获取一堆敏感凭证。路径语法使我可以一次拉出一堆相关的凭证,这很酷,但是如您所见,返回格式更多是字典列表。我已经剥离了所有内容,以便可以采用以下格式获取所有参数:

{
    '/a/b/c/d/e': 'xxxxxxxx', 
    '/a/b/c/d/f': 'xxxxxx', 
    '/a/b/c/g': 'xxxxxx'
}

但是我在将这种格式传递给某种(假设是递归的)函数时遇到麻烦,该函数将带有路径键的字典重新格式化为实际的嵌套字典,如下所示:

{
    'a': {
             'b': {
                      'c': {
                               'd': {
                                        'e': 'xxxxxxx',
                                        'f': 'xxxxxxx'
                                    },
                               'g': 'xxxxxxx'
                           }
                  }
         }
}

有人做过这样的事吗?

4 个答案:

答案 0 :(得分:3)

尝试一下:

d = {
    '/a/b/c/d/e': 'xxxxxxxx', 
    '/a/b/c/d/f': 'xxxxxx', 
    '/a/b/c/g': 'xxxxxx'
}

output = {}

for key, value in d.items():
    directories = key.split('/')[1:]
    helper = output
    for dire in directories[:-1]:
        if dire not in helper:
            helper[dire] = {}
        helper = helper[dire]
    helper[directories[-1]] = value

print(output)

输出为:

{
 'a': {
       'b': {
             'c': {
                   'd': {
                         'e': 'xxxxxxxx', 
                         'f': 'xxxxxx'
                        }, 
                   'g': 'xxxxxx'
                  }
            }
     }
}

答案 1 :(得分:1)

这种方法不能很好地满足您的需求,但是如果分隔符是句号而不是正斜杠,那么它将很好用。

  1. 从Pypi安装unflatten https://pypi.org/project/unflatten/

    pip install unflatten
    
  2. 代码:

    from unflatten import unflatten 
    
    t = {
        'a.b.c.d.e': 'xxxxxxxx', 
        'a.b.c.d.f': 'xxxxxx', 
        'a.b.c.g': 'xxxxxx'
    }
    
    print(unflatten(t))
    

输入:

{
    'a.b.c.d.e': 'xxxxxxxx', 
    'a.b.c.d.f': 'xxxxxx', 
    'a.b.c.g': 'xxxxxx' 
}

输出:

{'a': {'b': {'c': {'g': 'xxxxxx', 'd': {'f': 'xxxxxx', 'e': 'xxxxxxxx'}}}}}

答案 2 :(得分:1)

您可以继承follwoing之类的字典

class RecursiveDict(dict):
    def __missing__(self, key):
        self.__setleaf__(key, RecursiveDict())
        return self[key]

    def __setleaf__(self,key,value):
        super(RecursiveDict, self).__setitem__(key,value)

    def __setitem__(self, key,value):
        keys = key.strip('/').split('/')
        tmp = self
        for k in keys[:-1]:
            tmp = tmp[k]
        tmp.__setleaf__(keys[-1],value)

您可以按以下方式使用它

d = RecursiveDict()
d['/a/b/c/d/e'] =  'xxxxxxxx'
d['/a/b/c/d/f'] =  'xxxxxx' 
print(d)

答案 3 :(得分:0)

我编写了用于从参数存储中读取值的库(ssmenv

from ssmenv import SSMEnv

params = SSMEnv("/service/my-service", "/resource/mysql")

这样,您将获取“ / service / my-service”和“ / resource / mysql”命名空间下的所有密钥作为规范化的密钥,例如“ SERVICE_MY_SERVICE_DEBUG”