如何在S3中反转文件版本顺序,优先获取最旧版本
问题描述
我在S3中有一个存在多个版本的文件,已通过boto3库列出并展示了该文件的所有版本,但希望将顺序反转,优先显示最旧版本以便进行处理。现有代码、当前输出及期望输出如下:
现有代码
import json import boto3 import re import sys s3_r = boto3.resource('s3') bucket_name = 'dummy-data-bucket' file_key = 'employee_details/emp.csv' def s3versions(bucket, prefix): '''List all versions of files in s3.''' bucket = s3_r.Bucket(bucket) versions = bucket.object_versions.filter(Prefix = prefix) for version in versions: object = version.get() version_id = object.get('VersionId') if version_id != 'null': path = version.object_key last_modified = object.get('LastModified') print(path, version_id, last_modified, sep = '\t') def lambda_handler(event, context): s3versions(bucket_name,file_key)
当前输出
employee_details/emp.csv XXXXXXXXXXXXXXXXXZ.V0AYWKkz7hOyN 2024-10-25 14:40:56+00:00 employee_details/emp.csv XXXXXXXXXXXXXXXXXhdrHh8Yi_2XZ6W9 2024-10-25 14:38:54+00:00 employee_details/emp.csv XXXXXXXXXXXXXXXXXgg1FxEgb.TDnxnR 2024-10-25 14:37:17+00:00
期望输出
employee_details/emp.csv XXXXXXXXXXXXXXXXXgg1FxEgb.TDnxnR 2024-10-25 14:37:17+00:00 employee_details/emp.csv XXXXXXXXXXXXXXXXXhdrHh8Yi_2XZ6W9 2024-10-25 14:38:54+00:00 employee_details/emp.csv XXXXXXXXXXXXXXXXXZ.V0AYWKkz7hOyN 2024-10-25 14:40:56+00:00
解决方案
boto3的object_versions.filter()默认返回的版本是最新在前的顺序,要实现从旧到新排序,只需先将所有符合条件的版本信息收集到列表中,再按LastModified字段升序排序后输出即可。
修改后的代码如下:
import json import boto3 import re import sys s3_r = boto3.resource('s3') bucket_name = 'dummy-data-bucket' file_key = 'employee_details/emp.csv' def s3versions(bucket, prefix): '''List all versions of files in s3, ordered from oldest to newest.''' bucket = s3_r.Bucket(bucket) versions = bucket.object_versions.filter(Prefix = prefix) version_list = [] for version in versions: object = version.get() version_id = object.get('VersionId') if version_id != 'null': path = version.object_key last_modified = object.get('LastModified') # 将版本信息存入列表 version_list.append({ 'path': path, 'version_id': version_id, 'last_modified': last_modified }) # 按LastModified升序排序(最旧的在前) version_list.sort(key=lambda x: x['last_modified']) # 遍历排序后的列表打印 for item in version_list: print(item['path'], item['version_id'], item['last_modified'], sep='\t') def lambda_handler(event, context): s3versions(bucket_name,file_key)
说明
- 新增
version_list列表存储每个有效版本的路径、版本ID和修改时间 - 使用
sort()方法,以last_modified为排序键进行升序排列,确保最旧版本排在最前面 - 遍历排序后的列表输出,即可得到期望的顺序
内容的提问来源于stack exchange,提问作者sanju
相关产品推荐
相关产品推荐

