使用Boto3从S3存储桶下载所有文件

12 浏览
0 Comments

使用Boto3从S3存储桶下载所有文件

我正在使用boto3从s3存储桶中获取文件。我需要一个类似于aws s3 sync的功能。\n我的当前代码是:\n

#!/usr/bin/python
import boto3
s3=boto3.client('s3')
list=s3.list_objects(Bucket='my_bucket_name')['Contents']
for key in list:
    s3.download_file('my_bucket_name', key['Key'], key['Key'])

\n这个代码工作得很好,只要存储桶中只有文件。\n如果存储桶中有文件夹,它会抛出一个错误:\n

Traceback (most recent call last):
  File "./test", line 6, in 
    s3.download_file('my_bucket_name', key['Key'], key['Key'])
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/inject.py", line 58, in download_file
    extra_args=ExtraArgs, callback=Callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 651, in download_file
    extra_args, callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 666, in _download_file
    self._get_object(bucket, key, filename, extra_args, callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 690, in _get_object
    extra_args, callback)
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 707, in _do_get_object
    with self._osutil.open(filename, 'wb') as f:
  File "/usr/local/lib/python2.7/dist-packages/boto3/s3/transfer.py", line 323, in open
    return open(filename, mode)
IOError: [Errno 2] No such file or directory: 'my_folder/.8Df54234'

\n这是使用boto3下载完整的s3存储桶的正确方式吗?如何下载文件夹。

0
0 Comments

问题的出现原因:代码中下载文件的部分存在一些问题,可能导致文件下载的位置不正确,或者在不同目录中存在同名文件时会发生覆盖的情况。

解决方法:修改代码,确保文件下载的位置正确,并解决同名文件覆盖的问题。具体的修改方案如下:

import os
import boto3
# 初始化s3资源
s3 = boto3.resource('s3')
# 选择bucket
my_bucket = s3.Bucket('my_bucket_name')
# 下载文件到当前目录
for s3_object in my_bucket.objects.all():
    # 需要将s3_object.key拆分成路径和文件名,否则会出现文件不存在的错误
    path, filename = os.path.split(s3_object.key)
    # 创建子文件夹
    os.makedirs(path, exist_ok=True)
    # 下载文件
    my_bucket.download_file(s3_object.key, os.path.join(path, filename))

这个修改后的代码将确保文件下载到正确的位置,并且当存在同名文件时,它们将被保存在不同的目录中,避免了覆盖的问题。通过创建子文件夹,并将文件保存在正确的路径下,解决了之前代码中可能出现的问题。

0
0 Comments

当处理具有1000个以上对象的存储桶时,有必要实现一种使用NextContinuationToken在最多1000个键的顺序集上的解决方案。该解决方案首先编译对象列表,然后迭代地创建指定的目录并下载现有对象。

代码中的while next_token is not None:部分陷入了无限循环。实际上,这不应该发生,因为当boto3客户端在到达最后一页时会返回一个不包含NextContinuationToken的页面,从而退出while语句。如果将使用boto3 API获得的最后一个响应(存储在response变量中)粘贴出来,那么你会更清楚在你特定情况下发生了什么。尝试打印出'results'变量进行测试。我猜测你给定了一个在存储桶中没有匹配任何内容的前缀对象。你检查过了吗?

请注意,你需要做一些细微的更改,以使其适用于Digital Ocean。如此处所述。

使用这段代码时,我遇到了这个错误:'NoneType' object is not iterable: TypeError。

这是一篇很棒的文章,但将其分为更清晰的部分,即列出所有文件的复杂部分和实际而简单的下载部分,可能会更好。

0
0 Comments

Boto3是一个Python软件开发工具包,用于AWS(Amazon Web Services)的服务。它提供了访问和管理AWS服务的API,包括S3(Simple Storage Service)。

在这个问题中,用户需要从S3存储桶中递归地下载所有文件。为了解决这个问题,用户创建了一个名为download_dir的函数,该函数使用Boto3递归地下载文件。该函数首先通过调用get_paginator方法获取存储桶中的文件列表。然后,它遍历结果,并根据文件的类型(文件或目录)执行相应的操作。如果是目录,它会递归地调用download_dir函数来处理子目录。如果是文件,它会使用Boto3的download_file方法将文件下载到本地。

为了使用这个函数,用户需要创建一个S3客户端和资源,并调用download_dir函数来下载文件。函数的调用方式如下:

def _start():
    client = boto3.client('s3')
    resource = boto3.resource('s3')
    download_dir(client, resource, 'clientconf/', '/tmp', bucket='my-bucket')

这个方法似乎比用户当前的方法更好。用户打算尝试这个方法,感谢提供这个解决方案。

用户还提到Amazon文档中推荐使用这种方式来列出S3存储桶中的文件。

用户还提到自己手动创建的文件夹在显示时被当作“Key”而不是前缀,可能需要与这个方法结合使用。

其他用户在评论中提到不需要创建资源和客户端,只需要使用resource.meta.client即可。

还有一个用户遇到了一个OSError错误,他在调用download_file方法之前添加了一个条件来解决这个问题。

有用户问是否有类似于aws-cli命令“aws s3 sync”的功能可用于Boto3库。

还有用户认为S3团队犯了一个愚蠢的错误。

最后,有用户问dist在这里是什么意思,另一个用户建议在download_dir函数中调用get_paginator方法,并将paginator作为参数传递给download_dir函数。

这篇文章讨论了用户在使用Boto3下载S3存储桶中所有文件时遇到的问题,并提供了相应的解决方案。这些解决方案包括递归下载文件、使用Boto3的download_file方法、创建S3客户端和资源等。此外,还讨论了一些用户的疑问和其他用户的建议。

0