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

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("---")

代码细节说明

  1. 前缀筛选:用bucket.objects.filter(Prefix=target_prefix)可以获取所有以subfolder/images/开头的对象,这就相当于拿到了目标“文件夹”下的所有文件
  2. 跳过虚拟文件夹:S3会自动生成一个和前缀同名的空对象(用来在控制台显示文件夹),所以我们要跳过这个无效对象
  3. Rekognition参数:S3Object里的Name必须是完整的对象键,也就是从根桶到文件的完整路径,这样Rekognition才能准确定位到目标图片

这样修改后,你就能正常访问目标路径下的图片,并用Rekognition完成标签识别啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:40:49