python - 如何访问 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']
解决方案
有几种方法可以做到这一点。一种方法如下所示。
基于以下示例,并假设文件夹结构是固定的:
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])
在脚本中defaultdict
并set
用于确保存储唯一年份。输出将是:
bom {'2017', '2019', '2018'}
product {'2020', '2018', '2019'}
推荐阅读
- excel - 如何根据校验列的值计算两个单元格的差异?
- amazon-cloudwatch - 如何识别 kinesis 流中特定 KCL 的云观察指标
- macos - 在 Mac 中,为什么我必须按选项键才能使用 Python IDLE 中的快捷键?
- vue.js - 如何将带有查询参数的路由器添加到路由器列表中?
- javascript - array.includes 的奇怪行为对于字符串“sku”总是返回 false
- ssl - 指纹相同但序列号不同的 SSL 证书
- flutter - Flutter 集成测试 - 多个测试
- wpf - 如何减小滚动条的大小?
- javascript - 邮件地址输入的设定值无效
- c++ - 为什么我在 HackerRank 上得到的输出与我的 IDE 的输出不同?