使用boto3下载S3文件时如何正确指定存储桶内的文件路径
正确实现方案
核心规则说明
AWS boto3的S3接口要求参数严格拆分:
Bucket参数仅支持传入纯存储桶名称,不能拼接桶内路径- 桶内的路径前缀、完整文件路径都需要放到
Key参数中传递
你之前的报错就是因为把桶名和路径拼接后传给了Bucket参数,不符合S3桶名的命名规范。
对应CLI命令的boto3实现
1. 等同aws s3 ls s3://bucket-name-format/folder1/folder2/的代码
import boto3 s3 = boto3.client('s3', region_name='us-east-1', aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY) bucket_name = "bucket-name-format" # 注意S3的前缀开头不要加斜杠,否则会匹配开头带斜杠的Key prefix = "folder1/folder2/" # 列举指定前缀下的所有对象 response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix) if 'Contents' in response: for obj in response['Contents']: print(obj['Key'])
2. 等同aws s3 cp s3://bucket-name-format/folder1/folder2/myfile.csv.gz <本地路径>的代码
import boto3 s3 = boto3.client('s3', region_name='us-east-1', aws_access_key_id=KEY_ID, aws_secret_access_key=ACCESS_KEY) bucket_name = "bucket-name-format" # 拼接桶内的完整文件路径作为Key s3_file_key = "folder1/folder2/myfile.csv.gz" # 本地存储的文件路径,对应你代码里的final_name local_file_path = "myfile.csv.gz" s3.download_file( Filename=local_file_path, Bucket=bucket_name, Key=s3_file_key )
内容的提问来源于stack exchange,提问作者chowpay
相关产品推荐
相关产品推荐

