【问题标题】:AWS S3 object filter to NOT match Prefix in Python scriptAWS S3 对象过滤器与 Python 脚本中的前缀不匹配
【发布时间】:2022-01-20 14:25:20
【问题描述】:

当使用 Python/boto3 迭代 S3 对象时,我看到有一个过滤器方法。但是你可以应用 NOT 条件吗?

我只想获取顶级对象,而不是文件夹中的对象(它们有前缀)。我目前正在这样做并且它有效:

import boto3

s3 = boto3.resource('s3')
bucket = cfg['s3']['bucket_name']

for obj in s3.Bucket(bucket).objects.all():
    if not re.match('folder_name.*', obj.key):

我看到支持这样的过滤器:

for obj in s3.Bucket(bucket).objects.filter(Prefix=folder_name):

我问有没有办法说 Prefix != folder_name?

【问题讨论】:

    标签: python-3.x amazon-s3


    【解决方案1】:

    如果您只想要一个没有共享前缀的对象列表,请为过滤器指定分隔符,boto3 将过滤掉共享前缀:

    s3 = boto3.resource('s3')
    for obj in s3.Bucket(bucket).objects.filter(Delimiter='/'):
        print(obj.key)
    

    【讨论】:

      【解决方案2】:

      您可以使用s3pathlib 执行此操作。它为 S3Path 提供了一个面向目标的接口,因此您可以轻松地创建一个简单的过滤器函数,该函数将 S3Path 作为输入参数,并返回 True / False 以指示您是否要生成它。 这是一个解决您问题的示例

      from s3pathlib import S3Path
      
      # use tailing / to indicate that it is a dir
      p_dir = S3Path("bucket", "root_dir/")
      
      # define a filter
      n_parts_of_root_dir = len(p_dir.parts)
      
      def top_level_object(s3path):
          return len(s3path.parts) == (n_parts_of_root_dir + 1)
      
      for p in p_dir.iter_objects(limit=100).filter(top_level_object):
          ... do what ever you want
      

      您还可以进行更高级的过滤或利用开箱即用的内置过滤器。例如,您可以按S3Path.dirnameS3Path.basenameS3Path.fnameS3Path.ext 等属性进行过滤。请参阅此document 了解更多信息

      【讨论】:

        猜你喜欢
        • 2012-03-14
        • 2013-03-10
        • 1970-01-01
        • 2021-05-09
        • 2015-10-04
        • 2020-11-28
        • 2017-04-04
        • 2021-08-16
        • 1970-01-01
        相关资源
        最近更新 更多