使用Python从AWS S3下载文件

时间:2018-04-30 12:07:47

标签: python-3.x amazon-s3 download

我正在尝试使用以下代码将Amazon S3存储桶中的文件下载到我的本地,但我收到错误消息"无法找到凭据"

以下是我写的代码:

from boto3.session import Session
import boto3

ACCESS_KEY = 'ABC'
SECRET_KEY = 'XYZ'

session = Session(aws_access_key_id=ACCESS_KEY,
              aws_secret_access_key=SECRET_KEY)
s3 = session.resource('s3')
your_bucket = s3.Bucket('bucket_name')

for s3_file in your_bucket.objects.all():
print(s3_file.key)

s3 = boto3.client ('s3')

s3.download_file('your_bucket','k.png','/Users/username/Desktop/k.png')

有人可以帮我解决这个问题。感谢。

4 个答案:

答案 0 :(得分:8)

您没有使用您创建的会话来下载文件,而是使用您创建的s3客户端。如果要使用客户端,则需要指定凭据。

your_bucket.download_file('k.png', '/Users/username/Desktop/k.png')

s3 = boto3.client('s3', aws_access_key_id=... , aws_secret_access_key=...)
s3.download_file('your_bucket','k.png','/Users/username/Desktop/k.png')

答案 1 :(得分:1)

对于其他尝试从AWS S3下载文件的用户,以寻求具有其他行业优势功能的更用户友好的解决方案,请查看https://github.com/d6t/d6tpipe。它将S3函数抽象为一个更简单的接口。它还支持目录同步,上传文件,权限以及从S3(和ftp)同步文件所需的许多其他功能。

import d6tpipe
api = d6tpipe.api.APILocal() # keep permissions locally for security

settings = \
{
    'name': 'my-files',
    'protocol': 's3',
    'location': 'bucket-name',
    'readCredentials' : {
        'aws_access_key_id': 'AAA',
        'aws_secret_access_key': 'BBB'
    }
}

d6tpipe.api.create_pipe_with_remote(api, settings)

pipe = d6tpipe.Pipe(api, 'my-files')
pipe.scan_remote() # show all files
pipe.pull_preview() # preview
pipe.pull(['k.png']) # download single file
pipe.pull() # download all files

pipe.files() # show files
file=open(pipe.dirpath/'k.png') # access file

答案 2 :(得分:1)

example中的official documentation中,正确的格式为:

import boto3

s3 = boto3.client('s3', aws_access_key_id=... , aws_secret_access_key=...)
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME')

您还可以使用以二进制模式打开的类似文件的对象。

s3 = boto3.client('s3', aws_access_key_id=... , aws_secret_access_key=...)
with open('FILE_NAME', 'wb') as f:
    s3.download_fileobj('BUCKET_NAME', 'OBJECT_NAME', f)

有问题的代码使用s3 = boto3.client ('s3'),它不提供任何凭据。

用于验证客户端身份的格式显示为here

import boto3
client = boto3.client(
    's3',
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
    aws_session_token=SESSION_TOKEN,
)

# Or via the Session
session = boto3.Session(
    aws_access_key_id=ACCESS_KEY,
    aws_secret_access_key=SECRET_KEY,
    aws_session_token=SESSION_TOKEN,
)

最后,您还可以重新使用创建的经过身份验证的session来获取bucket,然后从存储桶中获取download then file

from boto3.session import Session
import boto3

ACCESS_KEY = 'ABC'
SECRET_KEY = 'XYZ'

session = Session(aws_access_key_id=ACCESS_KEY,
              aws_secret_access_key=SECRET_KEY)

# session is authenticated and can access the resource in question 
session.resource('s3')
    .Bucket('bucket_name')
    .download_file('k.png','/Users/username/Desktop/k.png')

答案 3 :(得分:0)

您可以使用 awscli 设置您的 AWS 配置文件,以避免在文件中引入您的凭证。首先添加您的个人资料:

aws configure --profile account1

然后在您的代码中添加:

aws_session = boto3.Session(profile_name="account1")
s3_client = aws_session.client('s3')