基于日期的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
相关产品推荐
相关产品推荐

