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

如何解决Boto3下载S3大存储桶指定子目录文件的1000条限制问题?

解决S3大存储桶指定前缀下文件批量下载问题

一、绕过1000条结果限制的最佳方案

是的,使用list_objects_v2结合循环处理分页是当前推荐的标准方案——list_objects属于旧版API,不仅存在1000条结果上限,list_objects_v2还提供了更灵活的分页控制能力。

你之前的代码手动判断前缀既低效又容易漏数据,正确的做法是直接在列表API中指定Prefix参数过滤目标文件,同时处理分页逻辑:

import boto3

client = boto3.client("s3")  # 省略配置信息
bucket_name = "tmp"
prefix = "my_test1/"
counter = 1

# 初始化分页参数
continuation_token = None
while True:
    # 根据是否有续传token调用接口
    if continuation_token:
        response = client.list_objects_v2(
            Bucket=bucket_name,
            Prefix=prefix,
            ContinuationToken=continuation_token
        )
    else:
        response = client.list_objects_v2(
            Bucket=bucket_name,
            Prefix=prefix
        )
    
    # 遍历当前页的对象
    for obj in response.get("Contents", []):
        key = obj["Key"]
        # 跳过S3控制台创建的"空文件夹"对象(如果存在)
        if key == prefix:
            continue
        local_filename = f"logABC{counter}.json"
        client.download_file(bucket_name, key, local_filename)
        counter += 1
    
    # 检查是否还有更多结果需要获取
    if not response.get("IsTruncated"):
        break
    continuation_token = response.get("NextContinuationToken")

二、更简洁的Resource API方式

如果使用boto3的Resource API,无需手动管理分页参数,代码会更简洁——它会自动处理1000条结果的分页逻辑:

import boto3

s3 = boto3.resource("s3")  # 省略配置信息
bucket = s3.Bucket("tmp")
prefix = "my_test1/"
counter = 1

for obj in bucket.objects.filter(Prefix=prefix):
    # 跳过空文件夹对象
    if obj.key == prefix:
        continue
    local_filename = f"logABC{counter}.json"
    obj.download_file(local_filename)
    counter += 1

三、关于client和resource下载单个文件的差异

你遇到的client.download_file失败但resource成功的情况,本质上两者底层调用的是同一个S3 API,大概率是client实例的配置问题(比如区域、端点设置不一致),而非API本身的限制。若要排查,可检查client和resource的配置参数是否完全一致。

内容的提问来源于stack exchange,提问作者user3782816

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 17:10:33