Python无法访问S3桶子文件夹以调用AWS Rekognition问题
解决Python访问S3子文件夹并调用Rekognition的问题
我来帮你搞定这个问题!核心原因其实是你误解了S3的存储逻辑——S3并没有真正的“文件夹”结构,那些看起来像文件夹的路径只是对象键(Object Key)的前缀而已。所以你不能把myBucket/subfolder/images/当作桶名来用,桶名只能是根桶myBucket,子路径需要作为对象键的一部分来处理。
下面是修正后的完整代码和关键说明:
核心修正点
- 桶名必须是根桶名称
myBucket,不能包含子路径 - 要获取目标路径下的图片,需要通过**前缀(Prefix)**筛选S3对象
- 调用Rekognition时,需要传入完整的对象键(比如
subfolder/images/one.jpg),而非仅文件名
修正后的代码
import boto3 # 初始化客户端:桶名只用根桶名 bucket_name = "myBucket" target_prefix = "subfolder/images/" # 这是我们要筛选的对象前缀 rekognition = boto3.client('rekognition') s3 = boto3.resource('s3') bucket = s3.Bucket(name=bucket_name) # 遍历目标前缀下的所有jpg图片 for obj in bucket.objects.filter(Prefix=target_prefix): # 跳过前缀本身(避免处理S3自动生成的虚拟文件夹空对象) if obj.key == target_prefix: continue # 只处理jpg格式的图片 if obj.key.endswith('.jpg'): print(f"正在处理图片: {obj.key}") # 调用Rekognition的detect_labels接口 response = rekognition.detect_labels( Image={ 'S3Object': { 'Bucket': bucket_name, 'Name': obj.key # 传入完整的对象键(包含子路径) } }, MaxLabels=10, MinConfidence=70 ) # 打印识别结果 print("识别到的标签:") for label in response['Labels']: print(f"- {label['Name']}: {label['Confidence']:.2f}%") print("---")
代码细节说明
- 前缀筛选:用
bucket.objects.filter(Prefix=target_prefix)可以获取所有以subfolder/images/开头的对象,这就相当于拿到了目标“文件夹”下的所有文件 - 跳过虚拟文件夹:S3会自动生成一个和前缀同名的空对象(用来在控制台显示文件夹),所以我们要跳过这个无效对象
- Rekognition参数:
S3Object里的Name必须是完整的对象键,也就是从根桶到文件的完整路径,这样Rekognition才能准确定位到目标图片
这样修改后,你就能正常访问目标路径下的图片,并用Rekognition完成标签识别啦!
内容的提问来源于stack exchange,提问作者Stacking
相关产品推荐
相关产品推荐

