如何在boto S3中获取文件/键大小?
我想有个简单的方法可以获取文件的大小(也就是关键大小),而不需要下载整个文件。我在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 个回答
在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文档
在 boto3 中:
s3.head_object
这个方法会发送一个 HEAD 请求,用来获取关于某个对象的元数据:
s3 = boto3.client('s3')
response = s3.head_object(Bucket='bucketname', Key='keyname')
size = response['ContentLength']
这样做是可以的:
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...)