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

如何使用boto3获取S3桶文件夹下的子文件夹和文件并解决迭代报错

问题根因

你抛出TypeError: list indices must be integers or slices, not str的核心原因是遍历逻辑错误:
你写的for i in folders中,i本身就是folders列表里存储的每一个子文件夹路径字符串,不是索引值,不需要再套一层folders[i]取值。


1. 直接修复现有报错的代码

把第二步的遍历逻辑修改为如下内容即可正常运行:

for folder_prefix in folders:
    # 直接传入每个子文件夹的前缀即可,不需要索引取值
    sub_result = client.list_objects(Bucket = bucket_name , Prefix = folder_prefix , Delimiter = '/')
    # 后续处理逻辑
    # 提取二级子文件夹(如果需要进一步遍历)
    if 'CommonPrefixes' in sub_result:
        second_level_folders = [p.get('Prefix') for p in sub_result.get('CommonPrefixes')]
    # 提取当前子文件夹根目录下的JSON文件
    if 'Contents' in sub_result:
        json_files = [obj.get('Key') for obj in sub_result.get('Contents') if obj.get('Key').endswith('.json')]

2. 更简洁的全量JSON读取方案

如果你不需要区分目录层级,只需要读取桶内所有符合要求的JSON文件,可以直接去掉Delimiter参数,配合S3分页器一次性递归获取所有文件,避免多层遍历,同时兼容文件量超过1000的场景:

import boto3
import json

s3_client = boto3.client('s3')
bucket_name = "countries"
path = "countries/"
all_json_data = []

# 分页器可以规避S3单次返回最多1000个对象的限制
paginator = s3_client.get_paginator('list_objects_v2')
for page in paginator.paginate(Bucket=bucket_name, Prefix=path):
    if 'Contents' in page:
        for obj in page['Contents']:
            obj_key = obj['Key']
            if obj_key.endswith('.json'):
                # 直接读取JSON文件内容
                response = s3_client.get_object(Bucket=bucket_name, Key=obj_key)
                json_content = json.loads(response['Body'].read().decode('utf-8'))
                all_json_data.append(json_content)

# 后续直接处理合并后的all_json_data即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 17:39:04