python-3.x 如何在S3中选择最后创建的对象

kmpatx3s  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(373)

我在S3中有这个路径:object1/object2/object3/object4/
Object4/中,我有一个对象列表,例如:

directory1/directory2/directory3/directory4/2022-30-09-15h21/

directory1/directory2/directory3/directory4/2023-20-12-12h30/

directory1/directory2/directory3/directory4/2022-31-12-09h34/

directory1/directory2/directory3/directory4/2023-12-08-14h56/

字符串
我想选择在directory4/中最后创建的目录,然后我应该下载它里面的所有文件。
我写了这个脚本来实现它:

import boto3
from datetime import datetime 

session_root = boto3.Session(region_name='eu-west-3', profile_name='my_profile')
s3_client = session_root.client('s3') 

bucket_name = 'my_bucket' 

prefix = 'object1/object2/object3/object4/'

# List objects in the bucket 
response = s3_client.list_objects_v2(Bucket=bucket_name, Prefix=prefix) 

# Extract the object names and convert them to datetime objects 

objects_with_dates = [(obj['Key'], datetime.strptime(obj['LastModified'].strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S')) for obj in response.get('Contents', [])] 
# Find the latest created object 

latest_object = max(objects_with_dates, key=lambda x: x[1]) 

print("Last created S3 object:", latest_object[0]) # the returned value is: object1/object2/object3/object4/2023-20-12-12h30/my_file.csv


我的脚本选择directory4/中最后创建的目录并下载最后创建的文件,我的脚本的结果是:directory1/directory2/directory3/directory4/2023-20-12-12h30/my_file.csv
但我想下载里面的所有文件。
你有一个想法,请我如何修改我的脚本,以选择最后创建的目录在directory4/和我下载里面的所有文件?
谢谢

yiytaume

yiytaume1#

看来你的要求是:

  • 列出给定前缀的所有子目录(例如directory1/directory2/directory3/directory4/下的所有子目录)
  • 在这些子目录中,使用包含YYYY-DD-MM-HHhmm时间戳的目录名查找表示最新日期的子目录
  • 下载该子目录中的所有对象

下面是一个使用S3返回的CommonPrefixes列表的示例程序,该列表实际上是一个子目录列表。

import boto3

BUCKET = 'my-bucket'
PREFIX = 'directory1/directory2/directory3/directory4/'

# Custom date sorter to handle YYYY-DD-MM-HHhmm format
def date_sorter(date):
    date_parts = date.split('-')
    return (date_parts[0], date_parts[2], date_parts[1], date_parts[3])

# Obtain a list of CommonPrefixes in the given Bucket and Prefix
# Use a paginator in case there are more than 1000 objects
s3_client = boto3.client('s3')
paginator = s3_client.get_paginator('list_objects_v2')
result = paginator.paginate(Bucket=BUCKET, Delimiter='/', Prefix=PREFIX)

# Get the 'latest' CommonPrefix but it is in the format YYYY-DD-MM-HHhmm
prefixes = [item['Prefix'] for item in result.search('CommonPrefixes')]
latest_prefix = sorted(prefixes, key=date_sorter)[-1]

# Download all objects from that prefix
s3_resource = boto3.resource('s3')
for object in s3_resource.Bucket(BUCKET).objects.filter(Prefix=latest_prefix):
    # Download to local directory using just the filename
    filename = object.key.split('/')[-1]
    print(f'Downloading {object.key}')
    object.Object().download_file(filename)

字符串

whlutmcx

whlutmcx2#

将最后创建的对象选择到S3 Buckets中的一种方法是创建DynamoDB,并使用Lambda和S3 Object Lambda将目录保存到DynamoDB中,并将索引放在修改/更改时间上。
Ofc你可以使用其他数据库,然后DynamoDB,但DynamoDB是非常便宜的开始,后来你可以考虑什么使sens通过改变DB,DynamoDB只有成本当你使用它,如果你使用该选项。
它比你要求的要复杂一点,但是如果你在S3中有100.000.000个对象,你需要为每个列表扫描和对象查找付费,所以如果你犯了错误,它可能会非常昂贵,所以我建议你使用S3 Object Lambda(https://aws.amazon.com/s3/features/object-lambda/)。

相关问题