使用Python从AWS S3下载文件

jdgnovmf  于 2023-01-06  发布在  Python
关注(0)|答案(5)|浏览(215)

我尝试使用下面的代码将文件从Amazon S3 Bucket下载到我的本地,但收到错误消息“无法找到凭据”
下面是我写的代码:

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')

有人能帮我一下吗?

kd3sttzy

kd3sttzy1#

你没有使用你创建的会话来下载文件,你使用的是你创建的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')
afdcj2ne

afdcj2ne2#

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

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)
    f.seek(0)

所讨论的代码使用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,
)

最后,您还可以重用您创建的经过验证的session来获取存储桶,然后从存储桶中下载文件。

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')
rur96b6h

rur96b6h3#

如果你想从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
wb1gzix0

wb1gzix04#

您可以使用awscli设置您的AWS配置文件,以避免在文件中引入您的凭据。

aws configure --profile account1

然后在代码中添加:

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

6pp0gazn5#

文件名:

可以是任何名称;用那个名字文件将被下载。
它可以添加到任何现有的本地目录。

密钥:

是S3文件路径沿着最后的文件名。
它不以反斜杠开头。

会话()

它会自动从~/.aws/config~/.aws/credentials中选择凭据
如果没有,则需要显式传递它。

from boto3.session import Session
import boto3

# Let's use Amazon S3
s3 = boto3.resource("s3")

# Print out bucket names to check you have accessibility
# for bucket in s3.buckets.all():
#     print(bucket.name)

session = Session()
OR
session = Session(aws_access_key_id="AKIAYJN2LNOU",
                  aws_secret_access_key="wMyT0SxEOsoeiHYVO3v9Gc",
                  region_name="eu-west-1")    

session.resource('s3').Bucket('bucket-logs').download_file(Key="logs/20221122_0_5ee03da676ac566336e2279decfc77b3.gz", Filename="/tmp/Local_file_name.gz")

相关问题