【问题标题】:Multipart get from s3 with boto3使用 boto3 从 s3 获取多部分
【发布时间】:2017-07-13 21:49:36
【问题描述】:

我将大 zip 文件存储在 s3 存储桶中,因此我想使用 python boto3 库分块下载它们。

我首先尝试使用 object.download_fileobj 方法,但无法仅获取对象的一部分,因此我现在使用支持 PartNumber=X 参数的 s3.get 方法。

但是,在我开始获取零件之前,我无法找到零件的数量。 我的意思是,如果我在参数中没有给出部件号的情况下调用 get,我会得到以下响应:

s3.Object('mybucket', 'mytest.zip').get()

{'ETag': '"493458a23b7d2ed524e8f144aa9e91f4-27"', 'LastModified': datetime.datetime(2017, 2, 23, 9, 53, 48, tzinfo=tzutc()), 'ResponseMetadata': {'RetryAttempts': 0, 'RequestId': 'E67ABBE9682AE0CA', 'HTTPHeaders': {'accept-ranges': 'bytes', 'x-amz-id-2': 'Kymvd3rkQZFkjOdnNvbh1f0OG2zFzwJQEai++kvfnZSNtQ2cSQ7wmASMZxT17xg/WJJ29xBxyUQ=', '日期':'星期四,2017 年 2 月 23 日 10:55:02 GMT','最后修改':'星期四,2 月 23 日 2017 年 09:53:48 GMT','服务器':'AmazonS3','内容类型': '应用程序/zip','x-amz-request-id':'E67ABBE9682AE0CA', '内容长度':'222492172','etag': '"493458a23b7d2ed524e8f144aa9e91f4-27"'}, 'HostId': 'Kymvd3rkQZFkjOdnNvbh1f0OG2zFzwJQEai++kvfnZSNtQ2cSQ7wmASMZxT17xg/WJJ29xBxyUQ=', 'HTTPStatusCode':200},'ContentLength':222492172,'ContentType': 'application/zip', 'Body': , 'AcceptRanges': 'bytes', '元数据': {}}

我们可以看到这里没有PartCount

如果我也这样做,但使用PartNumber=1

 s3.Object('mybucket', 'mytest.zip').get(PartNumber=1)

{'ETag': '"493458a23b7d2ed524e8f144aa9e91f4-27"', 'LastModified': datetime.datetime(2017, 2, 23, 9, 53, 48, tzinfo=tzutc()), 'PartsCount':27,'ContentRange':'字节 0-8388607/222492172', 'ResponseMetadata': {'RetryAttempts': 0, 'RequestId': '2EE3109196C76834', 'HTTPHeaders': {'accept-ranges': 'bytes', 'x-amz-id-2': 'Pl4ybedoDA99xCH2fa5zuge9Az7rPxZET+EB2fAZ4BtTDo5dqw/fJZ8PNu3vM5/0mTUkj9/AqhY=', “x-amz-mp-parts-count”:“27”,“日期”:“2017 年 2 月 23 日星期四 10:58:20 GMT”, 'etag': '"493458a23b7d2ed524e8f144aa9e91f4-27"', '内容范围': '字节 0-8388607/222492172', '内容类型': '应用程序/zip', '服务器':'AmazonS3','x-amz-request-id':'2EE3109196C76834', “内容长度”:“8388608”,“最后修改”:“2017 年 2 月 23 日,星期四 09:53:48 GMT'},'HostId': 'Pl4ybedoDA99xCH2fa5zuge9Az7rPxZET+EB2fAZ4BtTDo5dqw/fJZ8PNu3vM5/0mTUkj9/AqhY=', 'HTTPStatusCode':206},'ContentLength':8388608,'ContentType': 'application/zip', 'Body': , 'AcceptRanges': 'bytes', '元数据': {}}

我知道可以看到块的数量

“零件数”:27

有没有办法在我开始下载文件之前获取块的数量?

【问题讨论】:

    标签: python amazon-s3 boto3


    【解决方案1】:

    您可以使用head_object 获取该号码。或者,由于您使用的是对象资源,Object.parts_count

    【讨论】:

    • 其实Object.parts_count返回None,head_object只包含以下键['ETag', 'LastModified', 'AcceptRanges', 'ResponseMetadata', 'Metadata', 'ContentLength', 'ContentType']
    • 如果您将PartNumber=1 作为参数传递给head_object,它将返回包含零件数量的PartsCount
    猜你喜欢
    • 2018-05-21
    • 2021-05-22
    • 2022-11-10
    • 1970-01-01
    • 2017-04-21
    • 2019-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    相关资源
    最近更新 更多