You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:42:33