如何在 boto S3 中获取文件/密钥大小?

Posted

技术标签:

【中文标题】如何在 boto S3 中获取文件/密钥大小?【英文标题】:How do I get the file / key size in boto S3? 【发布时间】:2011-07-15 23:53:03 【问题描述】:

必须有一种简单的方法来获取文件大小(密钥大小),而无需提取整个文件。我可以在 AWS S3 浏览器的属性中看到它。而且我认为我可以从“HEAD”请求的“Content-length”标头中删除它。但我并没有将关于如何用 boto 做到这一点的点点滴滴联系起来。如果您发布指向比standard boto docs 中更全面的示例的链接,请多加赞赏。

编辑:所以以下似乎可以解决问题(尽管从查看源代码我不完全确定。):

bk = conn.get_bucket('my_bucket_name')
ky = boto.s3.key.Key(bk)
ky.open_read()  ## This sends a GET request. 
print ky.size

现在我将把问题留给 cmets、更好的解决方案或指向示例的指针。

【问题讨论】:

【参考方案1】:

这可行:

bk = conn.get_bucket('my_bucket_name')
key = bk.lookup('my_key_name')
print key.size

查找方法只是在存储桶上对键名执行 HEAD 请求,因此它将返回键的所有标头(包括内容长度),但不会传输任何键的实际内容。

S3 tutorial 提到了这一点,但不是很明确,也不是在这个确切的上下文中。我将为此添加一个部分以帮助您更轻松地找到它。

注意:对于每个像 http://boto.cloudhackers.com/s3_tut.html 这样返回 404 的旧链接,在 ".com" 之后添加 "/en/latest"http://boto.cloudhackers.com/en/latest/s3_tut.html 。 (有人需要探索 mod_rewrite...)

【讨论】:

首先感谢您的响应和开发 Boto。没有它,我会扯掉我的头发。 我还建议先检查“如果键为无”。 现在查找 boto 文档更好的地方是 boto.readthedocs.org 此解决方案使用 Boto 2.x 在 Boto3 中的 API 有所不同。见AWS Docs【参考方案2】:

boto3中:

s3.head_object 还执行 HEAD 请求以检索有关对象的元数据:

s3 = boto3.client('s3')
response = s3.head_object(Bucket='bucketname', Key='keyname')
size = response['ContentLength']

【讨论】:

这对我来说似乎产生了不正确的结果,我相信这是由于 KMS 加密。只是需要注意的事情。在这种情况下,@satznova 的回答对我有用。【参考方案3】:

boto3 中使用 S3 资源:

boto3.resource('s3').Bucket(bucketname).Object(keyname).content_length

S3 客户端的head_object 调用返回给我一个http“403 Forbidden”

【讨论】:

【参考方案4】:

Boto 3中:

使用 S3 Object,您可以获取文件(又名对象)大小(以字节为单位)。它是代表 Amazon S3 对象的资源。

实际上你可以获得与对象相关的所有元数据。比如content_length对象大小、content_language内容所在语言、content_encodinglast_modified等。

import boto3

s3 = boto3.resource('s3')
object = s3.Object('bucket_name','key')
file_size = object.content_length #size in bytes

参考boto3 doc

【讨论】:

你的内联 cmets 不是 Python 发生在我们所有人身上 只是上面object 实例化的注释。如果'key' 不存在,object = s3.Object('bucket_name','key') 仍然可以工作......只有在执行file_size = object.content_length 时,当您尝试访问存储桶中的实际对象时,您才会得到404ClientError 异常。跨度> 【参考方案5】:

如果需要检查多个文件,您还可以获得所有对象的列表。对于给定的存储桶运行list_objects_v2,然后遍历响应“内容”。例如:

s3_client = boto3.client('s3')
response_contents = s3_client.list_objects_v2(
        Bucket='name_of_bucket'
        ).get('Contents')

你会得到一个这样的字典列表:

['Key': 'path/to/object1', 'LastModified': datetime, 'ETag': '"some etag"', 'Size': 2600, 'StorageClass': 'STANDARD', 'Key': 'path/to/object2', 'LastModified': 'datetime', 'ETag': '"some etag"', 'Size': 454, 'StorageClass': 'STANDARD', ... ]

请注意,列表中的每个字典都包含“Size”键,即您的特定对象的大小。它是可迭代的

for rc in response_contents:
    print(f"Size: rc.get('Size')")

您可以获得所有您可能感兴趣的文件的大小:

Size: 2600
Size: 454
Size: 2600
...

【讨论】:

以上是关于如何在 boto S3 中获取文件/密钥大小?的主要内容,如果未能解决你的问题,请参考以下文章

使用boto从S3逐行读取文件?

使用 boto3 lib 和 AWS Lambda 从 S3 存储桶中的压缩文件中获取数据流

Amazon S3 boto - 如何创建文件夹?

使用boto3,从整个文件夹或文件从一个s3存储桶复制到同一区域的另一个文件夹时,如何提供访问密钥和秘密访问密钥?

如何使用 boto3 将 S3 对象保存到文件中

Amazon S3 boto:如何重命名存储桶中的文件?