如何使用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
相关产品推荐
相关产品推荐

