使用时间戳过滤器列出 S3 存储桶中的对象

问题描述 投票:0回答:4

背景

有没有办法获取 s3 存储桶上比特定时间戳更新的所有文件的列表。例如,我试图找出并获取昨天下午修改的所有文件的列表。

特别是我有一个名为

foo-bar
的存储桶,里面有一个名为
prod
的文件夹,其中我试图通过谎言解析文件。

到目前为止我正在尝试的事情

我参考了 boto3 文档,到目前为止得出了以下内容。

from boto3 import client
conn = client('s3')
conn.list_objects(Bucket='foo-bar', Prefix='prod/')['Contents']

问题

此解决方案有两个问题,第一个是它只列出 1000 个文件,即使我有超过 10,000 个文件,另一个是我不确定如何过滤时间?

python amazon-web-services amazon-s3 boto3
4个回答
3
投票

您可以根据时间戳进行过滤:

import boto3
from datetime import datetime, timedelta
from dateutil.tz import tzutc

condition_timestamp = datetime.now(tz=tzutc()) - timedelta(days=2, hours=12)  #dynamic condition
#condition_timestamp = datetime(2023, 2, 17, tzinfo=tzutc()) #Fixed condition

s3 = boto3.client('s3')

paginator = s3.get_paginator('list_objects_v2')
 
s3_filtered_list = [obj for page in paginator.paginate(Bucket="foo-bar",Prefix="prod/") for obj in page["Contents"] if obj['LastModified'] > condition_timestamp]

s3_filtered_list

请注意,我为您提供了两个选项来根据时间戳创建条件...动态(从现在开始的 x 时间)或固定(x 日期时间)


1
投票

由于 AWS S3 API 不支持任何过滤概念,因此您需要根据返回的对象进行过滤。

此外,

list_objects
list_objects_v2
API一次仅支持返回1000个对象,因此您需要对结果进行分页,一次又一次地调用它以获取存储桶中的所有对象。有一个辅助方法
get_paginator
可以为您处理这个问题。

因此,您可以将这两个放在一起,并获取存储桶中所有对象的列表,并根据您认为合适的标准过滤它们:

import boto3
from datetime import datetime, UTC

# Pick a target timestamp to filter objects on or after
# Note, it must be in UTC
target_timestamp = datetime(2023, 2, 1, tzinfo=UTC)
found_objects = []

# Create and use a paginator to list more than 1000 objects in the bucket
s3 = boto3.client('s3')
paginator = s3.get_paginator('list_objects_v2')
for page in paginator.paginate(Bucket=BUCKET):
    # Pull out each list of objects from each page
    for cur in page.get('Contents', []):
        # Check each object to see if it matches the target criteria
        if cur['LastModified'] >= target_timestamp:
            # If so, add it to the final list
            found_objects.append(cur)

# Just show the number of found objects in this example
print(f"Found {len(found_objects)} objects")

0
投票

您可以尝试使用 S3.Paginator.ListObjects,它将返回

'LastModified': datetime(2015, 1, 1)
作为
Contents
数组中对象元数据的一部分。然后,您可以根据
Key
条件将对象
LastModified
保存到本地列表中。


0
投票

更方便的方法可能是获取 s3 库存并基于此过滤对象。这只是一个想法。稍后我会测试并更新是否有效

© www.soinside.com 2019 - 2024. All rights reserved.