使用Python从AWS S3下载文件

Tau*_*eer 11 download amazon-s3 python-3.x boto3

我正在尝试使用以下代码从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) # prints the contents of bucket

s3 = boto3.client ('s3')

s3.download_file('your_bucket','k.png','/Users/username/Desktop/k.png')
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我这个.谢谢.

小智 18

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

your_bucket.download_file('k.png', '/Users/username/Desktop/k.png')
Run Code Online (Sandbox Code Playgroud)

要么

s3 = boto3.client('s3', aws_access_key_id=... , aws_secret_access_key=...)
s3.download_file('your_bucket','k.png','/Users/username/Desktop/k.png')
Run Code Online (Sandbox Code Playgroud)

  • @Joaquin 请将文档添加到您找到它的位置以获得更完整的答案。尽管如此 +1 (4认同)

Inc*_*tic 12

官方文档中的一个例子来看,正确的格式是:

import boto3

s3 = boto3.client('s3', aws_access_key_id=... , aws_secret_access_key=...)
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME')
Run Code Online (Sandbox Code Playgroud)

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

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)
    f.seek(0)
Run Code Online (Sandbox Code Playgroud)

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

对鉴定客户端的格式显示在这里

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,
)
Run Code Online (Sandbox Code Playgroud)

最后,您还可以重新使用您创建的经过身份验证的会话来获取存储桶然后从存储桶下载文件

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')
Run Code Online (Sandbox Code Playgroud)

  • 对于您使用“download_fileobj”,我建议您添加以下行:“f.seek(0)”。文件处于不确定状态。这行确保您从头开始阅读(我自己花了一些时间弄清楚这一点!) (5认同)