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

时间:2011-03-15 17:29:53

标签: python amazon-s3 boto

必须有一种简单的方法来获取文件大小(密钥大小)而不需要覆盖整个文件。我可以在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

现在,我将提出问题,更好的解决方案或示例指示。

5 个答案:

答案 0 :(得分:65)

这样可行:

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

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

S3 tutoria l提到了这一点,但不是非常明确,而不是在这个确切的背景下。我将在此处添加一个部分,以便于查找。

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

答案 1 :(得分:31)

boto3

中的

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

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

答案 2 :(得分:7)

boto3中使用S3资源:

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

S3客户端的head_object调用返回了一个HTTP“ 403 Forbidden”

答案 3 :(得分:1)

如果需要检查多个文件,还可以获取所有对象的列表。对于给定的存储桶,运行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'}, ... ]

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

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

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

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

答案 4 :(得分:0)

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