首页 > 解决方案 > 如何访问 AWS s3 存储桶中的子文件夹(对象)并将其保存到 python 列表中?

问题描述

这是我的 s3 存储桶

s3.Bucket(name='external')

我正在使用 boto3.resource 方法:

s3 = boto3.resource(
    's3',
    region_name='ap-southeast-1',
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=aws_secret_access_key
)

s3文件夹结构是这样的:

external\product\2018\abc.csv
external\product\2019\abc.csv
external\bom\2018\csd.csv
external\bom\2019\zyc.csv

请注意,2018、2019 都是内部产品和 bom。

我试过这样做:


bucket = s3.Bucket(bucket)
print(bucket)
result = bucket.meta.client.list_objects(Bucket=bucket.name,
                                         Delimiter='/')
print(result)                                    
for o in result.get('CommonPrefixes'):
    print(o.get('Prefix'))

这只会给我:

product\
bom\

我实际上需要的是年份列表:

2018\
2019\
2018\
2019\

并将它们存储两个单独的列表 Product 和 bom

Product =['2018','2019']
Bom = ['2018','2019']



标签: pythonamazon-web-servicesamazon-s3boto3boto

解决方案


有几种方法可以做到这一点。一种方法如下所示。

基于以下示例,并假设文件夹结构是固定的:

external\bom\2017\csd.csv
external\bom\2018\csd.csv
external\bom\2019\zyc.csv
external\product\2018\abc.csv
external\product\2019\abc.csv
external\product\2020\abc.csv

以下 python 脚本可以工作:

import boto3

from collections import defaultdict

session = boto3.session.Session(profile_name='<profile-name>')

bucket = session.resource('s3').Bucket('external')

key_year = defaultdict(set)

for obj in bucket.objects.all():
    key_split = obj.key.split('\\')
    key_year[key_split[1]].add(key_split[2])

for k in key_year:
    print(k, key_year[k])

在脚本中defaultdictset用于确保存储唯一年份。输出将是:

bom {'2017', '2019', '2018'}
product {'2020', '2018', '2019'}

推荐阅读