必须有一种简单的方法来获取文件大小(密钥大小)而不需要覆盖整个文件。我可以在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
现在,我将提出问题,更好的解决方案或示例指示。
答案 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)
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_encoding
,last_modified
等
import boto3
s3 = boto3.resource('s3')
object = s3.Object('bucket_name','key')
file_size = object.content_length //size in bytes