【发布时间】:2021-01-15 17:49:12
【问题描述】:
我正在尝试从我的 s3 存储桶中检索所有文件名。但我不需要所有内容,只需要存储桶中某些位置的文件名。这样做有困难。我正在尝试使用 Boto3.Resource 但运气不佳。我能够连接到存储桶并检索存储桶的所有名称。但是当涉及到子文件夹时,就会遇到问题。
这是我的代码:
import boto3
s3 = boto3.resource(
service_name = 's3',
region_name = 'us-west-1',
aws_access_key_id = 'XXXXXXXXXXXXX',
aws_secret_access_key = 'YYYYYYYYYYYYYYY')
for x in s3.buckets.all():
print(x)
# I am able to list the names of the buckets.
# loop through all buckets
for x in s3.buckets.all():
# make sure this is my bucket.
if x == 'my-data-bucket':
objs = list(x.objects.filter(Delimiter = '', Prefix='my-data-bucket/helpdesk/production/docs/'))
for i in range(0, len(objs)):
print(objs[i].key)
# print all the file names.
请记住,“docs”子文件夹还有其他子文件夹,例如 001、002、003 ... 等,每个文件夹也有文档
目标是在类似这种格式的csv文件中列出所有文件名
/my-data-bucket
/helpdesk/production/docs/001/x.pdf
/helpdesk/production/docs/001/zz.pdf
/helpdesk/production/docs/002/aa.pdf
/helpdesk/production/docs/003/rr.pdf
etc .....
【问题讨论】:
-
您无法使用列表对象 API 对其进行更多过滤。为什么不直接获取所需前缀中所有对象的列表,然后在 python 中过滤它们?
-
含义:objs = list(s3.Bucket(my-data-bucket).objects.all()) - 像这样将所有内容添加到列表中,但是您将如何过滤它们观点?谢谢
-
您可以使用 listobjectsv2 客户端调用(boto3.amazonaws.com/v1/documentation/api/latest/reference/…) 来获取所有对象并指定前缀。这将返回所有对象的列表。现在遍历此列表并将您需要的项目添加到新的过滤列表中。
-
桶中有多少个对象?您多久需要一次此列表?我问是因为使用Amazon S3 Inventory 可能更容易,它可以提供列出所有对象的每日或每周 CSV 文件。
-
存储桶中的对象超过 1000 个,并且会不断增长。多久...每天...
标签: python amazon-web-services csv amazon-s3 boto3