如何用Python的Boto3列出S3指定文件夹my_location下的对象?
解决S3特定前缀对象列表获取问题
我来帮你搞定这个问题~你之前的错误在于把前缀路径和桶名拼在一起传给了Bucket()构造函数,S3的桶名是独立的,不能包含任何路径前缀,这就是你触发格式异常的原因。
下面是两种正确的实现方式,适配你的权限场景:
方法一:使用boto3 Resource(和你原有代码风格一致)
利用objects.filter()方法指定Prefix参数,就能只获取特定路径下的对象,而且完全符合你的权限范围:
from boto3 import resource # 建立S3连接 s3_connection = resource( service_name='s3', aws_access_key_id=s3_key, aws_secret_access_key=s3_secret ) # 这里只传入纯桶名,不要加前缀 s3_bucket_connection = s3_connection.Bucket(s3_bucket) # 通过Prefix过滤,建议前缀末尾加斜杠,避免匹配到类似my_locationXXX的无关对象 for my_obj in s3_bucket_connection.objects.filter(Prefix='my_location/'): # 打印对象的键(即完整路径),比直接打印对象实例更直观 print(my_obj.key)
方法二:使用boto3 Client(更适合大量对象的分页场景)
如果你的目标路径下有超过1000个对象,Client的list_objects_v2方法支持分页处理,避免一次性返回数据过多:
import boto3 # 建立S3 Client连接 s3_client = boto3.client( 's3', aws_access_key_id=s3_key, aws_secret_access_key=s3_secret ) # 初始请求获取对象列表 response = s3_client.list_objects_v2( Bucket=s3_bucket, Prefix='my_location/' ) # 遍历当前页的对象 for obj in response.get('Contents', []): print(obj['Key']) # 处理分页:如果还有更多对象,循环获取下一页 while response.get('IsTruncated'): continuation_token = response['NextContinuationToken'] response = s3_client.list_objects_v2( Bucket=s3_bucket, Prefix='my_location/', ContinuationToken=continuation_token ) for obj in response.get('Contents', []): print(obj['Key'])
关键注意点
- S3没有真正的“文件夹”概念,所谓的文件夹其实是对象键的前缀,所以
Prefix='my_location/'能精准匹配所有以my_location/开头的对象,不会误匹配类似my_location_test的键。 - 因为你的权限仅限定在
my_location路径下,这两种方式都会自动只请求你有权访问的对象,不会触发全桶遍历的权限错误。
内容的提问来源于stack exchange,提问作者ahajib
相关产品推荐
相关产品推荐

