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

如何在Python Lambda中为S3文件重命名并追加时间戳?

S3文件移动并追加时间戳的Lambda函数修复方案

原代码存在的问题

  1. 未定义data变量:dt = datetime.datetime.strptime(data[4]+data[5],'%Y%m%d%H%M%S')中的data从未声明,执行到这里直接抛出异常,后续逻辑根本无法运行
  2. datetime对象直接拼接字符串报错:即使成功生成dt,直接将datetime对象与字符串相加会触发类型错误,无法生成预期文件名
  3. 文件名格式错误:直接把时间戳加在完整文件名末尾,会得到filename.extYYYYMMDDHHMMSS,不符合filename-YYYYMMDDHHMMSS.ext的需求
  4. 缺少原文件删除步骤:S3没有原生“移动”操作,仅复制到processed文件夹后,原文件仍会留在原位置,并未真正完成“移动”

修复后的代码片段

import datetime
import os  # 新增,用于处理文件名拆分

def handler(event, context):
    LOGGER.info(f'Event structure: {event}')
    LOGGER.info(f'DST_BUCKET: {DST_BUCKET}')

    for record in event['Records']:
        src_bucket_name = record['s3']['bucket']['name']
        src_key = record['s3']['object']['key']

        copy_source = {
            'Bucket': src_bucket_name,
            'Key': src_key
        }
        LOGGER.info(f'copy_source: {copy_source}')
        dst_bucket = s3.Bucket(DST_BUCKET)
        LOGGER.info(f'bucket: {dst_bucket}')

        # 复制到目标桶
        dst_bucket.copy(copy_source, src_key)

        try:
            # 验证目标桶文件是否存在
            s3.Object(DST_BUCKET, src_key).load()
            LOGGER.info(f"File {src_key} uploaded to Bucket {DST_BUCKET}")

            src_bucket = s3.Bucket(src_bucket_name)  # 直接用事件里的源桶名,避免硬编码

            # 生成时间戳字符串(当前处理时间)
            timestamp = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
            # 拆分文件名和扩展名
            file_name, file_ext = os.path.splitext(os.path.basename(src_key))
            # 构建新的目标key:processed/文件名-时间戳.扩展名
            new_processed_key = f'processed/{file_name}-{timestamp}{file_ext}'

            # 复制到processed文件夹
            src_bucket.copy(copy_source, new_processed_key)
            LOGGER.info(f"File copied to processed folder: {new_processed_key}")

            # 删除原文件(完成S3的“移动”操作)
            s3.Object(src_bucket_name, src_key).delete()
            LOGGER.info(f"Original file {src_key} deleted from source bucket")

        except Exception as e:
            LOGGER.error(f"Error processing file {src_key}: {str(e)}")
            return {"error": str(e)}

    return {'status': 'ok'}

关键修改说明

  • 时间戳生成:用datetime.now().strftime()直接生成格式化的时间戳字符串,避免strptime的解析错误(如果需要使用文件的最后修改时间,可以替换为s3.Object(src_bucket_name, src_key).last_modified.strftime('%Y%m%d%H%M%S'))
  • 文件名处理:通过os.path.splitext和os.path.basename正确拆分文件名与扩展名,确保时间戳加在文件名和扩展名之间
  • 源桶名动态获取:从事件中直接获取源桶名,避免硬编码导致的兼容性问题
  • 新增原文件删除:复制完成后删除原文件,真正实现S3中的“移动”效果
  • 错误日志增强:添加错误日志,方便排查问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 10:29:57