Python 使用Boto3从S3下载文件夹

Python 使用Boto3从S3下载文件夹

在本文中,我们将介绍如何使用Python和Boto3库从Amazon S3(简称S3)下载文件夹。S3是一种可扩展和高度可靠的对象存储服务,我们可以使用Boto3库轻松地与之进行交互。

阅读更多:Python 教程

确保已安装Boto3库

在开始之前,请确保你已经安装了Boto3库。如果没有安装,你可以使用以下命令来安装:

pip install boto3
Python

配置S3凭证

使用Boto3与S3进行交互需要提供有效的凭证。你可以在AWS控制台上创建一对访问密钥,或者使用IAM角色。无论你选择哪种方式,你都需要将凭证信息配置到你的环境变量中,或者通过创建.aws/credentials文件来存储它们。

假设你已经配置好了S3的凭证。

下载整个文件夹

我们将从S3下载整个文件夹并保存在本地。为了实现这一目标,我们需要使用Boto3库中的client对象和download_file方法。下面是一个示例代码:

import boto3
import os

def download_s3_folder(bucket, folder, output_dir):
    s3_client = boto3.client('s3')

    response = s3_client.list_objects_v2(Bucket=bucket, Prefix=folder)

    if 'Contents' not in response:
        return

    for item in response['Contents']:
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        file_path = os.path.join(output_dir, item['Key'])
        s3_client.download_file(bucket, item['Key'], file_path)
        print(f"Downloaded {file_path}")

# 下载示例
download_s3_folder('my-bucket', 'my-folder', 'my-output-dir')
Python

在上面的示例中,我们定义了一个download_s3_folder函数,接受S3存储桶名称、要下载的文件夹名称和输出目录名称作为参数。我们首先使用boto3.client方法来创建一个S3客户端对象。接下来,我们使用list_objects_v2方法来列出指定文件夹下的所有对象,并遍历每个对象。我们使用os.makedirs方法创建输出目录(如果不存在),然后使用download_file方法将每个对象下载到本地。最后,我们在终端中打印每个文件的下载路径。

要使用这个函数,你需要替换my-bucketmy-foldermy-output-dir为你自己的S3存储桶名称、文件夹名称和输出目录名称。然后,运行脚本,它将下载指定文件夹下的所有文件并保存在指定的输出目录中。

下载文件夹中的特定文件类型

有时候我们只对文件夹中的特定文件类型感兴趣。在这种情况下,我们可以使用文件扩展名来筛选要下载的文件。下面是一个示例代码:

import boto3
import os

def download_s3_folder_by_extension(bucket, folder, output_dir, extension):
    s3_client = boto3.client('s3')

    response = s3_client.list_objects_v2(Bucket=bucket, Prefix=folder)

    if 'Contents' not in response:
        return

    for item in response['Contents']:
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        if item['Key'].endswith(extension):
            file_path = os.path.join(output_dir, item['Key'])
            s3_client.download_file(bucket, item['Key'], file_path)
            print(f"Downloaded {file_path}")

# 下载示例(只下载扩展名为.png的文件)
download_s3_folder_by_extension('my-bucket', 'my-folder', 'my-output-dir', '.png')
Python

在上述示例中,我们创建了一个新的download_s3_folder_by_extension函数,它接受一个额外的extension参数,用于指定要下载的文件扩展名。我们在遍历文件对象之前检查每个对象的Key属性是否以指定的扩展名结尾。如果是,我们将该文件下载到本地。

下载文件夹下的子文件夹

在某些情况下,我们可能需要下载文件夹下的所有子文件夹及其包含的文件。为了实现这个功能,我们可以使用递归调用。下面是一个示例代码:

import boto3
import os

def download_s3_folder_recursive(bucket, folder, output_dir):
    s3_client = boto3.client('s3')

    response = s3_client.list_objects_v2(Bucket=bucket, Prefix=folder)

    if 'Contents' not in response:
        return

    for item in response['Contents']:
        if item['Key'].endswith('/'):
            subfolder = item['Key']
            download_s3_folder_recursive(bucket, subfolder, output_dir)
        else:
            if not os.path.exists(output_dir):
                os.makedirs(output_dir)
            file_path = os.path.join(output_dir, item['Key'])
            s3_client.download_file(bucket, item['Key'], file_path)
            print(f"Downloaded {file_path}")

# 下载示例(下载文件夹及其子文件夹中的所有文件)
download_s3_folder_recursive('my-bucket', 'my-folder', 'my-output-dir')
Python

在上面的示例中,我们修改了download_s3_folder函数,以支持递归下载子文件夹。当遇到一个以斜杠/结尾的对象时,我们将该对象视为子文件夹,并使用递归调用download_s3_folder_recursive函数来下载子文件夹及其包含的文件。这样,我们就可以在下载文件夹的同时,下载所有子文件夹和它们的文件。

总结

本文介绍了如何使用Python和Boto3库从S3下载文件夹。我们学习了如何下载整个文件夹,如何下载特定文件类型以及如何下载文件夹下的子文件夹。通过这些示例,你可以轻松地将S3中的文件下载到本地并进行进一步的分析和处理。希望这篇文章对你有所帮助!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册