【问题标题】:Python - How can I convert S3 folders into JSON hierarchy?Python - 如何将 S3 文件夹转换为 JSON 层次结构?
【发布时间】:2021-07-15 21:14:18
【问题描述】:

我使用 boto3 创建了一个列表,其中包含我的 S3 存储桶中的所有子文件夹。列表排序如下:

s3_list = ['a', 'a/a1/a11', 'b', 'b/b1', 'b/b2', 'b/b2/b22']

我正在尝试将此列表转换为 JSON 层次结构:

{
    "root": [
        {
            "name": "a",
            "path": "a",
            "child": [
                {
                    "name": "a1",
                    "path": "a/a1",
                    "child": [
                        {
                            "name": "a11",
                            "path": "a/a1/a11"
                        }
                    ]
                }
            ]
        },
        {
            "name": "b",
            "path": "b",
            "child": [
                {
                    "name": "b1",
                    "path": "b/b1"
                },
                {
                    "name": "b2",
                    "path": "b/b2",
                    "child": [
                        {
                            "name": "b22",
                            "path": "b/b2/b22"
                        }
                    ]
                }
            ]
        }

    ]
}

在 Python 中实现此功能的最佳方式/库是什么?

【问题讨论】:

    标签: python json python-3.x amazon-web-services amazon-s3


    【解决方案1】:

    你可以使用递归collections.defaultdict:

    from collections import defaultdict
    s3_list = ['a', 'a/a1/a11', 'b', 'b/b1', 'b/b2', 'b/b2/b22']
    def to_dict(d, c = []):
       if not d:
          return {}
       _d, r = defaultdict(list), []
       for a, *b in d:
          _d[a].append(b)
       return [{'name':a, 'path':'/'.join(c+[a]), 
               **({} if not (k:=list(filter(None, b))) else  {'children':to_dict(k, c+[a])})} 
               for a, b in _d.items()]
          
    result = {'root':to_dict([i.split('/') for i in s3_list])}
    

    import json
    print(json.dumps(result, indent=4))
    

    输出:

    {
       "root": [
          {
            "name": "a",
            "path": "a",
            "children": [
                {
                    "name": "a1",
                    "path": "a/a1",
                    "children": [
                        {
                            "name": "a11",
                            "path": "a/a1/a11"
                        }
                    ]
                }
            ]
        },
        {
            "name": "b",
            "path": "b",
            "children": [
                {
                    "name": "b1",
                    "path": "b/b1"
                },
                {
                    "name": "b2",
                    "path": "b/b2",
                    "children": [
                         {
                            "name": "b22",
                            "path": "b/b2/b22"
                         } 
                      ]
                   }
               ]
           }
       ]
    }
    

    【讨论】:

    • @dm2111 很高兴为您提供帮助!
    • @dm2111 如果对您有帮助,请考虑接受此答案。
    猜你喜欢
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2019-10-08
    相关资源
    最近更新 更多