如何获得boto3 Collection的大小?

时间:2015-09-05 00:03:33

标签: python collections boto3

我一直在使用的方法是将Collection转换为List并查询长度:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlServerCe;
using System.Data.SqlClient;

namespace O2
{
public partial class SalesBill : Form
{

    public SalesBill()
    {
        InitializeComponent();
    }



    private void SalesBill_Load(object sender, EventArgs e)
    {
     foreach (DataRow row in databaseDataSet.Clients.Rows)
        {
            listBox1.Items.Add(row["Client_Name"]);
        }

    }
  }
 }

但是,这会强制解决整个系列,并且首先避免使用Collection的好处。有更好的方法吗?

3 个答案:

答案 0 :(得分:23)

如果没有列出所有对象,就无法获取存储桶中的密钥数量这是AWS S3的限制(请参阅https://forums.aws.amazon.com/thread.jspa?messageID=164220)。

获取对象摘要(HEAD)不会获得实际数据,因此应该是相对便宜的操作,如果您只是丢弃列表,那么您可以这样做:

size = sum(1 for _ in bucket.objects.all())

这将为您提供不构建列表的对象数。

答案 1 :(得分:1)

借用similar question,从bucket +前缀中检索对象键的完整列表的一个选项是使用list_objects_v2方法的递归。

此方法将递归检索对象键列表,一次检索1000个键。

list_objects_v2的每个请求都使用StartAfter参数继续列出上一个请求中最后一个密钥后的密钥。

import boto3

if __name__ == '__main__':

    client = boto3.client('s3',
        aws_access_key_id     = 'access_key',
        aws_secret_access_key = 'secret_key'
    )

    def get_all_object_keys(bucket, prefix, start_after = '', keys = []):
        response = client.list_objects_v2(
            Bucket     = bucket,
            Prefix     = prefix,
            StartAfter = start_after
        )

        if 'Contents' not in response:
            return keys

        key_list = response['Contents']
        last_key = key_list[-1]['Key']

        keys.extend(key_list)

        return get_all_object_keys(bucket, prefix, last_key, keys)

    object_keys = get_all_object_keys('your_bucket', 'prefix/to/files')

    print(len(object_keys))

答案 2 :(得分:0)

对于我的用例,我只需要知道该文件夹是否为空。

s3 = boto3.client('s3')
response = s3.list_objects(
        Bucket='your-bucket',
        Prefix='path/to/your/folder/',
)
print(len(response['Contents']))

这足以知道该文件夹是否为空。请注意,如果在S3控制台中手动创建文件夹,则可以将其视为资源本身。在这种情况下,如果上面显示的长度大于1,那么S3"文件夹"是空的。