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

基于日期的S3文件迁移Python脚本实现问询

S3文件按指定日期迁移脚本实现

核心逻辑

  • 用boto3连接S3客户端,遍历源路径下的所有对象
  • 过滤出指定日期的文件(匹配对象的LastModified属性)
  • 按stage/YYYY/MM/DD格式构造目标文件夹路径
  • 复制对象到目标路径,可选删除源对象

完整代码实现

import boto3
from datetime import datetime, timezone

def s3_migrate_by_date(source_bucket, source_prefix, target_bucket, target_base_prefix, target_date):
    # 初始化S3客户端
    s3 = boto3.client('s3')
    
    # 将目标日期转为UTC时区的datetime对象(匹配S3返回的时间格式)
    target_date_obj = datetime.strptime(target_date, "%Y-%m-%d").replace(tzinfo=timezone.utc)
    # 计算日期范围:当天00:00到次日00:00
    next_day = target_date_obj.replace(day=target_date_obj.day + 1)
    
    # 分页列出源路径下的所有对象(处理超过1000个文件的场景)
    paginator = s3.get_paginator('list_objects_v2')
    page_iterator = paginator.paginate(Bucket=source_bucket, Prefix=source_prefix)
    
    for page in page_iterator:
        if 'Contents' not in page:
            continue
        
        for obj in page['Contents']:
            obj_key = obj['Key']
            # 跳过S3的虚拟文件夹
            if obj_key.endswith('/'):
                continue
            
            obj_last_modified = obj['LastModified']
            # 筛选指定日期的文件
            if target_date_obj <= obj_last_modified < next_day:
                # 构造目标路径:stage/YYYY/MM/DD/原文件名
                date_part = obj_last_modified.strftime("%Y/%m/%d")
                target_key = f"{target_base_prefix.rstrip('/')}/{date_part}/{obj_key.split('/')[-1]}"
                
                # 执行复制操作
                copy_source = {'Bucket': source_bucket, 'Key': obj_key}
                s3.copy_object(CopySource=copy_source, Bucket=target_bucket, Key=target_key)
                print(f"已复制: {obj_key} -> {target_key}")
                
                # 可选:复制完成后删除源文件
                # s3.delete_object(Bucket=source_bucket, Key=obj_key)
                # print(f"已删除源文件: {obj_key}")

if __name__ == "__main__":
    # 配置参数,替换为自己的桶信息和路径
    SOURCE_BUCKET = "your-source-bucket"
    SOURCE_PREFIX = "source-folder/"  # 源文件夹前缀,建议以/结尾
    TARGET_BUCKET = "your-target-bucket"
    TARGET_BASE_PREFIX = "stage"
    TARGET_DATE = "2023-01-12"  # 要迁移的目标日期
    
    s3_migrate_by_date(SOURCE_BUCKET, SOURCE_PREFIX, TARGET_BUCKET, TARGET_BASE_PREFIX, TARGET_DATE)

关键注意事项

  • 时区处理:S3返回的LastModified是UTC时区,代码中统一转成UTC避免时区偏差导致过滤错误
  • 分页机制:当源文件夹文件数超过1000时,必须用分页器paginator,否则会遗漏文件
  • 权限要求:运行脚本的IAM账号需要源桶的s3:ListBucket、s3:GetObject权限,以及目标桶的s3:PutObject权限(如果要删除源文件,还需s3:DeleteObject权限)
  • 前缀格式:源前缀建议以/结尾,避免匹配到名称相似的非目标对象

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:35:16