You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

说明

  1. 新增version_list列表存储每个有效版本的路径、版本ID和修改时间
  2. 使用sort()方法,以last_modified为排序键进行升序排列,确保最旧版本排在最前面
  3. 遍历排序后的列表输出,即可得到期望的顺序

内容的提问来源于stack exchange,提问作者sanju

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 21:02:39