botocore.exceptions.ClientError: 在调用HeadObject操作时发生错误(404): 未找到

53
我正在从AWS S3存储桶中下载文件,就像这样:
import boto3

s3client = boto3.client("s3")
s3 = boto3.resource('s3')

bucket_name = 'practice_bucket'
bucket = s3.Bucket(bucket_name)

for obj in bucket.objects.all():
    filename = obj.key.rsplit('/')[-1]
    s3client.download_file(bucket_name, obj.key, "/txt/" + filename)
尝试将一些文件放入子目录(例如/txt/)时,出现以下错误:

botocore.exceptions.ClientError: An error occurred (404) when calling the HeadObject operation: Not Found

奇怪的是,使用相同的方法可以处理其他文件类型,但无法处理扩展名为.json的文件。
可能出了什么问题?我甚至尝试过不将它们放在绝对子目录路径中,那样就不会报错,并且会将文件下载到与下载脚本相同的目录下。但是,当我实际定义要下载文件的路径时,就会出现错误。

18
我刚试了你的代码,它很好用。如果你遇到了404错误,那就意味着请求的密钥和实际密钥之间存在不匹配。 - 2ps
16
这个问题应该重新开放。我有同样的问题,他提供了期望的行为、具体问题和错误信息,以及代码。现在我不得不另外开一张票来解决完全相同的问题。我的密钥匹配,并且我已经进行了登录确认。 - Christopher Pisz
5
在我的情况下似乎与权限有关。我重新创建了Lambda权限策略,然后它又开始正常工作了。 - Christopher Pisz
6
我也遇到过这个问题。对我来说,只要密钥不以绝对路径开头(即不以“/”开头),它就可以正常工作。 - JJCV
4
当我不小心拼错了我要下载的文件名时,出现了这个错误。 - NorahKSakal
显示剩余9条评论
2个回答

6

您的代码正确。

botocore.exceptions.ClientError:调用HeadObject操作时发生错误(404):未找到

当您尝试获取的对象未在存储桶中时,将引发此错误。


2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Neeraj
这个答案非常完美,为我提供了解决问题所需的所有信息。在我的情况下,我只是在下载调用周围添加了一个try/except botocore.exceptions.ClientError,这样当预期的文件不存在时就可以捕获错误了。 - Jeremy Goodell

0

升级aiobotocore解决了我的问题。

pip install --upgrade aiobotocore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接