python - 如何在 python 中从 S3 多部分下载大文件?

标签 python amazon-s3 download multipart

我正在寻找一些 Python 代码,这些代码允许我从 S3 中分段下载大文件。我找到了这个 github page ,但是所有命令行参数传递和解析器以及其他让我难以理解代码的东西太复杂了。我不是在寻找任何花哨的东西,而是想要一个基本代码,这样我就可以静态地将 2-3 个文件名放入其中,并让它执行这些文件的多部分下载。

任何人都可以为我提供这样的解决方案或链接吗?或者可以帮助我清理上面发布的链接中的代码?

最佳答案

这是旧的,但这是我为让它工作所做的:

conn.download_file(
    Bucket=bucket,
    Filename=key.split("/")[-1],
    Key=key,
    Config=boto3.s3.transfer.TransferConfig(
        max_concurrency=parallel_threads
    )
)

这是我在一些漂亮的可视化代码中使用它的方式:

import boto3
import math
import os
import time


def s3_get_meta_data(conn, bucket, key):
    meta_data = conn.head_object(
    Bucket=bucket,
    Key=key
)
return meta_data


def s3_download(conn, bucket, key, parallel_threads):
    start = time.time()
    md = s3_get_meta_data(conn, bucket, key)
    chunk = get_cunks(md["ContentLength"], parallel_threads)
    print("Making %s parallel s3 calls with a chunk size of %s each..." % (
        parallel_threads, convert_size(chunk))
    )
    cur_dir = os.path.dirname(os.path.realpath(__file__))
    conn.download_file(
        Bucket=bucket,
        Filename=key.split("/")[-1],
        Key=key,
        Config=boto3.s3.transfer.TransferConfig(
            max_concurrency=parallel_threads
        )
    )
    end = time.time() - start
    print("Finished downloading %s in %s seconds" % (key, end))


def convert_size(size_bytes):
    if size_bytes == 0:
        return "0B"
    size_name = ("B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
    i = int(math.floor(math.log(size_bytes, 1024)))
    p = math.pow(1024, i)
    s = round(size_bytes / p, 2)
    return "%s %s" % (s, size_name[i])


def get_cunks(size_bytes, desired_sections):
    return size_bytes / desired_sections


session = boto3.Session(profile_name="my_profile")
conn = session.client("s3", region_name="us-west-2")

s3_download(
    conn,
    "my-bucket-name",
    "my/key/path.zip",
    5
)

可以向 Config 参数提供更多信息,请在 aws 文档中阅读:

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/customizations/s3.html#boto3.s3.transfer.TransferConfig

关于python - 如何在 python 中从 S3 多部分下载大文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32511229/

相关文章:

java - 使用WSDL生成REST客户端会是错误的方向吗?

ruby - 如何拯救 Aws::AwsError: NoSuchKey

amazon-s3 - 重写 Amazon S3 静态 URL

amazon-web-services - 使用 tar.gz 文件作为 Amazon Athena 的源

php - 在 Zend Framework 中发送下载的多部分响应

javascript - 无法从 JQUERY 将 JSON 数据发送到 python

python - 正确执行 fftshift 和 ifftshift 的顺序(在 python 中)

Python Altair 绘制两个偏差标准

php - 下载文件的 MIME 类型

angular - Electron 下载文件,就像在普通浏览器中一样