63

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

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

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

现在,我将把问题留待评论、更好的解决方案或指向示例的指针。

4

5 回答 5

75

这会起作用:

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

查找方法只是在存储桶上对 keyname 执行 HEAD 请求,因此它将返回 key 的所有 headers(包括 content-length),但不会传输 key 的任何实际内容。

S3 教程l 提到了这一点,但不是很明确,也不是在这个确切的上下文中。我将为此添加一个部分,以帮助更容易找到它。

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

于 2011-03-31T11:07:14.810 回答
66

boto3中:

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

s3 = boto3.client('s3')
response = s3.head_object(Bucket='bucketname', Key='keyname')
size = response['ContentLength']
于 2017-05-08T22:46:32.123 回答
19

boto3使用 S3 资源时:

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

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

于 2018-11-05T17:33:30.380 回答
18

博托 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 文档

于 2019-05-24T15:04:12.767 回答
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
...
于 2020-08-04T20:36:22.267 回答