如何在 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_encoding
、last_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
时,当您尝试访问存储桶中的实际对象时,您才会得到404
的ClientError
异常。跨度>
【参考方案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 中获取文件/密钥大小?的主要内容,如果未能解决你的问题,请参考以下文章
使用 boto3 lib 和 AWS Lambda 从 S3 存储桶中的压缩文件中获取数据流