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

73 投票
7 回答
104370 浏览
提问于 2025-04-16 13:45

我想有个简单的方法可以获取文件的大小(也就是关键大小),而不需要下载整个文件。我在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

目前我会把这个问题留着,欢迎大家评论、提供更好的解决方案或指向一些例子。

7 个回答

27

Boto 3中:

使用S3的Object,你可以获取文件(也就是对象)的大小,单位是字节。这是一个代表亚马逊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; ClientError if file does not exist

参考 boto3文档

79

boto3 中:

s3.head_object 这个方法会发送一个 HEAD 请求,用来获取关于某个对象的元数据:

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

这样做是可以的:

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

这个查找方法实际上是对存储桶进行一个HEAD请求,目的是获取指定的键名的所有头信息(包括内容长度),但不会传输这个键的实际内容。

这个S3教程提到过这个,但没有很明确地说明,也没有在这个具体的上下文中提到。我会添加一个部分,帮助大家更容易找到相关信息。

注意:对于每一个像http://boto.cloudhackers.com/s3_tut.html这样的旧链接,如果返回404错误,可以在".com"后面加上"/en/latest",变成http://boto.cloudhackers.com/en/latest/s3_tut.html。(有人需要研究一下mod_rewrite...)

撰写回答