Amazon s3 python:从s3 bucket对象创建Json格式的目录结构

Amazon s3 python:从s3 bucket对象创建Json格式的目录结构,amazon-s3,boto3,python-3.8,Amazon S3,Boto3,Python 3.8,我使用以下方法获取s3存储桶中的对象 s3 = boto3.resource( service_name='s3', aws_access_key_id=key_id, aws_secret_access_key=secret ) for summary_obj in s3.Bucket(bucket_name).objects.all(): print(summary_obj.key) 它给了我所有像这样的东西 'sub1/sub1_1/file1.zip',

我使用以下方法获取s3存储桶中的对象

s3 = boto3.resource(
    service_name='s3',
    aws_access_key_id=key_id,
    aws_secret_access_key=secret
)
for summary_obj in s3.Bucket(bucket_name).objects.all():
    print(summary_obj.key)
它给了我所有像这样的东西

'sub1/sub1_1/file1.zip',
'sub1/sub1_2/file2.zip',
'sub2/sub2_1/file3.zip',
'sub3/file4.zip',
'sub4/sub4_1/file5.zip',
'sub5/sub5_1/file6.zip',
'sub5/sub5_2/file7.zip',
'sub5/sub5_3/file8.zip',
'sub6/'
但我想在我的应用程序中显示一个包含所有对象的json列表,这些对象都具有这样的正确目录结构

[
{'sub1': [
    {
        'sub1_1': ['file1.zip'] // All files in sub1_1 folder
    },
    {
        'sub1_2': ['file2.zip'] // All files in sub1_2 folder
    },

]},
{'sub2': [
    {
        'sub2_1': [
            'file3.zip'
        ]
    }
]},
{'sub3': [
    'file4.zip'
]},
{'sub4': [
    {
        'sub4_1': [
            'file5.zip'
        ]
    }
]},
{'sub5': [
    {
        'sub5_1': [
            'file6.zip'
        ]
    },
    {
        'sub5_2': [
            'file7.zip'
        ]
    },
    {
        'sub5_3': [
            'file8.zip'
        ]
    }
]},
{'sub6': []}
]

在python3.8中实现这一点的最佳方法是什么?

我尝试了一下,最接近您的json的方法是通过使用任何级别的子文件夹和文件夹的递归:

from collections import defaultdict  

objects=['sub1/sub1_1/file1.zip',
'sub1/sub1_2/file2.zip',
'sub2/sub2_1/file3.zip',
'sub3/file4.zip',
'sub4/sub4_1/file5.zip',
'sub5/sub5_1/file6.zip',
'sub5/sub5_2/file7.zip',
'sub5/sub5_3/file8.zip',
'sub5/sub5_3/file9.zip',
'sub5/sub5_3/sub5_4/file1.zip',
'sub5/sub5_3/sub5_4/file2.zip',
'sub6/']

#print(objects)

def construct_dict(in_list, accumulator):
  if not in_list:
    return
  else:
    if in_list[0] not in accumulator:
      accumulator[in_list[0]] =  defaultdict(list)  
    return construct_dict(in_list[1::], accumulator[in_list[0]])

accumulator = defaultdict(list)
for obj in objects:
  construct_dict(obj.split('/'), accumulator)

print(json.dumps(accumulator))      
其中给出(内容相同,但结构有点不同):


谢谢你的回答,但我需要一个包含文件夹中所有文件的列表。在你的代码中,它给出了一个命令
{
  "sub1": {
    "sub1_1": {
      "file1.zip": {}
    },
    "sub1_2": {
      "file2.zip": {}
    }
  },
  "sub2": {
    "sub2_1": {
      "file3.zip": {}
    }
  },
  "sub3": {
    "file4.zip": {}
  },
  "sub4": {
    "sub4_1": {
      "file5.zip": {}
    }
  },
  "sub5": {
    "sub5_1": {
      "file6.zip": {}
    },
    "sub5_2": {
      "file7.zip": {}
    },
    "sub5_3": {
      "file8.zip": {},
      "file9.zip": {},
      "sub5_4": {
        "file1.zip": {},
        "file2.zip": {}
      }
    }
  },
  "sub6": {
    "": {}
  }
}