使用Python的boto3从指定S3路径下载文件时遇404错误求助
解决S3文件下载404错误的方案
我来帮你搞定这个问题,你遇到的404错误大概率是代码里的S3对象路径没写对,咱们一步步排查解决:
1. 核心问题:对象键路径不完整
你手动下载用的是完整路径s3://name1/name2/file_name.txt,但代码里调用download_file时,第二个参数只传了file_name.txt——这就相当于告诉S3去桶name1的根目录找这个文件,而实际上它在name2前缀下面,自然会返回404。
另外还要注意:download_file的第三个参数如果只传文件夹路径(比如my_local_folder),在部分系统下会报错,最好指定完整的本地文件名。
给你修正后的代码,直接从传入的S3路径里解析桶名和对象键,避免手动拼接出错:
import boto3 locations = ['s3://name1/name2/file_name.txt'] s3_client = boto3.client('s3') for s3_path in locations: # 拆分S3路径,获取桶名和对象键 stripped_path = s3_path.replace('s3://', '') bucket_name, object_key = stripped_path.split('/', 1) # 拼接本地保存路径(确保包含文件名) local_file = f'my_local_folder/{object_key.split("/")[-1]}' # 执行下载 s3_client.download_file(bucket_name, object_key, local_file)
2. 其他可能的排查方向
如果修正路径后还是报错,可以检查这几个点:
- 权限不一致:手动下载用的凭证和代码里的AWS凭证可能不是同一个,确认代码使用的IAM角色/用户有
s3:GetObject权限,能访问该桶和对象。 - 区域不匹配:如果你的S3桶在特定区域(比如
ap-southeast-1),初始化boto3客户端时要指定区域,否则可能会访问到错误的端点:s3_client = boto3.client('s3', region_name='你的桶所在区域') - 大小写敏感问题:S3的对象名是大小写敏感的,确认代码里的文件名和S3上的完全一致(比如别把
File_Name.txt写成file_name.txt)。 - 拼写错误:再核对一遍桶名
name1、前缀name2和文件名,有时候多一个空格或者少一个字符都会导致404。
内容的提问来源于stack exchange,提问作者Atihska
相关产品推荐
相关产品推荐

