如何在S3存储桶中查找文件夹的大小?

时间:2018-04-10 17:43:06

标签: python amazon-web-services amazon-s3 boto boto3

我在python中使用boto3模块与S3进行交互,目前我能够获得S3存储桶中每个键的大小。但我的动机是找到只有顶级文件夹的空间存储(每个文件夹是一个不同的项目),我们需要为每个项目收取所用空间的费用。我能够获取顶级文件夹的名称,但没有获得有关下面实现中文件夹大小的任何详细信息。以下是我获取顶级文件夹名称的实现。

import boto
import boto.s3.connection

AWS_ACCESS_KEY_ID = "access_id"
AWS_SECRET_ACCESS_KEY = "secret_access_key"
Bucketname = 'Bucket-name' 

conn = boto.s3.connect_to_region('ap-south-1',
   aws_access_key_id=AWS_ACCESS_KEY_ID,
   aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
   is_secure=True, # uncomment if you are not using ssl
   calling_format = boto.s3.connection.OrdinaryCallingFormat(),
   )

bucket = conn.get_bucket('bucket')
folders = bucket.list("", "/")

for folder in folders:
    print(folder.name)

这里的文件夹类型是boto.s3.prefix.Prefix,它不显示任何大小的细节。有没有办法通过它的名称搜索S3存储桶中的文件夹/对象,然后获取该对象的大小?

5 个答案:

答案 0 :(得分:3)

为了获取S3文件夹的大小,objects(可在boto3.resource('s3')。Bucket中访问)提供方法filter(Prefix),该方法仅允许您检索文件尊重Prefix条件,因此使其相当优化。

import boto3

def get_size(bucket, path):
    s3 = boto3.resource('s3')
    my_bucket = s3.Bucket(bucket)
    total_size = 0

    for obj in my_bucket.objects.filter(Prefix=path):
        total_size = total_size + obj.size

    return total_size

因此,假设您要获取文件夹s3://my-bucket/my/path/的大小,则可以这样调用上一个函数:

get_size("my-bucket", "my/path/")

这当然很容易适用于顶级文件夹

答案 1 :(得分:3)

要通过使用list_objects_v2从S3获取1000个以上的对象,请尝试

from boto3 import client
conn = client('s3')

top_level_folders = dict()

paginator = conn.get_paginator('list_objects_v2')
pages = paginator.paginate(Bucket='bucket', Prefix='prefix')
index = 1
for page in pages:
    for key in page['Contents']:
        print(key['Size'])
        folder = key['Key'].split('/')[index]
        print("Key %s in folder %s. %d bytes" % (key['Key'], folder, key['Size']))

        if folder in top_level_folders:
            top_level_folders[folder] += key['Size']
        else:
            top_level_folders[folder] = key['Size']

for folder, size in top_level_folders.items():
    size_in_gb = size/(1024*1024*1024)
    print("Folder: %s, size: %.2f GB" % (folder, size_in_gb))

如果前缀为notes /,而分隔符为斜杠(/),则与 notes / summer / july,常用前缀是notes / summer /。 如果前缀是“ notes /”:索引= 1或“ notes / summer /”:索引= 2

答案 2 :(得分:2)

查找顶级"文件夹的大小"在S3中(S3没有真的有文件夹的概念,但有点在UI中显示文件夹结构),这样的东西可以工作:

from boto3 import client
conn = client('s3')

top_level_folders = dict()

for key in conn.list_objects(Bucket='kitsune-buildtest-production')['Contents']:

    folder = key['Key'].split('/')[0]
    print("Key %s in folder %s. %d bytes" % (key['Key'], folder, key['Size']))

    if folder in top_level_folders:
        top_level_folders[folder] += key['Size']
    else:
        top_level_folders[folder] = key['Size']


for folder, size in top_level_folders.items():
    print("Folder: %s, size: %d" % (folder, size))

答案 3 :(得分:1)

def find_size(name, conn):
  for bucket in conn.get_all_buckets():
    if name == bucket.name:
      total_bytes = 0
      for key in bucket:
        total_bytes += key.size
        total_bytes = total_bytes/1024/1024/1024
      print total_bytes 

答案 4 :(得分:1)

不使用boto3,而是使用aws cli,但是这种快速的一线功能可以达到目的。我通常将尾巴-1改为仅获得摘要文件夹的大小。但是对于具有许多对象的文件夹可能会有点慢。

aws s3 ls –汇总–人类可读–递归s3:// bucket-name / folder-name |尾巴-1