背景
有没有办法获取 s3 存储桶上比特定时间戳更新的所有文件的列表。例如,我试图找出并获取昨天下午修改的所有文件的列表。
特别是我有一个名为
foo-bar
的存储桶,里面有一个名为 prod
的文件夹,其中我试图通过谎言解析文件。
到目前为止我正在尝试的事情
我参考了 boto3 文档,到目前为止得出了以下内容。
from boto3 import client
conn = client('s3')
conn.list_objects(Bucket='foo-bar', Prefix='prod/')['Contents']
问题
此解决方案有两个问题,第一个是它只列出 1000 个文件,即使我有超过 10,000 个文件,另一个是我不确定如何过滤时间?
您可以根据时间戳进行过滤:
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 日期时间)
由于 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")
您可以尝试使用 S3.Paginator.ListObjects,它将返回
'LastModified': datetime(2015, 1, 1)
作为 Contents
数组中对象元数据的一部分。然后,您可以根据 Key
条件将对象 LastModified
保存到本地列表中。
更方便的方法可能是获取 s3 库存并基于此过滤对象。这只是一个想法。稍后我会测试并更新是否有效