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

mjh*_*jhm 46 python amazon-s3 boto

必须有一种简单的方法来获取文件大小(密钥大小)而不需要拉过整个文件.我可以在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
Run Code Online (Sandbox Code Playgroud)

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

gar*_*aat 67

这可行:

bk = conn.get_bucket('my_bucket_name')
key = bk.lookup('my_key_name')
print key.size
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 新文档建议使用bk.get_key而不是bk.lookup (9认同)
  • 感谢您的回应并首先开发Boto.没有它,我会把头发撕掉. (2认同)

Kri*_*ian 36

boto3中:

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

s3 = boto3.client('s3')
response = s3.head_object(Bucket='bucketname', Key='keyname')
size = response['ContentLength']
Run Code Online (Sandbox Code Playgroud)


sat*_*ova 13

博托 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
Run Code Online (Sandbox Code Playgroud)

参考boto3 文档

  • 只是上面关于“对象”实例化的注释。如果 `'key'` 不存在, `object = s3.Object('bucket_name','key')` 仍然有效...只有在执行 `file_size = object.content_length` 时才会得到 `ClientError`当您尝试访问存储桶中的实际对象时,会出现“404”异常。 (3认同)

oyo*_*ant 10

boto3使用S3资源:

boto3.resource('s3').Bucket(bucketname).Object(keyname).content_length
Run Code Online (Sandbox Code Playgroud)

head_objectS3客户端的电话给我返回了一个HTTP“ 403 Forbidden”


Leo*_*nkv 7

如果需要检查多个文件,您还可以获得所有对象的列表。对于给定的存储桶,运行list_objects_v2然后迭代响应“内容”。例如:

s3_client = boto3.client('s3')
response_contents = s3_client.list_objects_v2(
        Bucket='name_of_bucket'
        ).get('Contents')
Run Code Online (Sandbox Code Playgroud)

你会得到一个像这样的字典列表:

[{'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'}, ... ]
Run Code Online (Sandbox Code Playgroud)

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

for rc in response_contents:
    print(f"Size: {rc.get('Size')}")
Run Code Online (Sandbox Code Playgroud)

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

Size: 2600
Size: 454
Size: 2600
...
Run Code Online (Sandbox Code Playgroud)