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

如何修改Python脚本实现AWS S3增量提取本地未存在文件?

解决方案:仅下载S3中新增且本地不存在的文件

这个需求很典型——既要做增量同步,又要避免重复下载已有的文件。我们可以从筛选时间范围和检查本地文件存在性两个维度来修改你的代码,下面是具体实现:

核心思路

  1. 计算「一小时前的UTC时间」:因为S3对象的last_modified属性是UTC时区,必须用UTC时间对比才不会有误差
  2. 列出S3目标文件夹下的所有对象,筛选出过去一小时内修改/新增的文件
  3. 对每个符合时间条件的文件,检查本地LOCAL_PATH中是否已存在,不存在则下载
  4. 自动创建本地缺失的目录,避免因路径不存在报错

修改后的完整代码

import boto
import os
import datetime
from os import path

# 配置参数(请替换成你的实际信息)
LOCAL_PATH = "/your/local/directory"
S3_BUCKET_NAME = "your-s3-bucket-name"
S3_FOLDER_PREFIX = "target/folder/in/s3/"  # 如果要同步整个桶,留空字符串

def sync_s3_incremental():
    # 计算一小时前的UTC时间(S3的last_modified是UTC时区)
    one_hour_ago = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(hours=1)
    
    # 连接S3
    conn = boto.connect_s3()
    bucket = conn.get_bucket(S3_BUCKET_NAME)
    
    # 遍历S3目标文件夹下的所有对象
    for key in bucket.list(prefix=S3_FOLDER_PREFIX):
        # 跳过S3的虚拟文件夹(以/结尾的键)
        if key.name.endswith('/'):
            continue
        
        # 1. 筛选过去一小时内新增/修改的文件
        if key.last_modified.replace(tzinfo=datetime.timezone.utc) >= one_hour_ago:
            # 拼接本地文件路径
            local_file_path = os.path.join(LOCAL_PATH, key.name)
            # 确保本地目录存在,不存在则自动创建
            os.makedirs(os.path.dirname(local_file_path), exist_ok=True)
            
            # 2. 检查本地是否已存在该文件,不存在则下载
            if not path.exists(local_file_path):
                print(f"Downloading new file: {key.name}")
                key.get_contents_to_filename(local_file_path)
            else:
                print(f"File already exists locally: {key.name}")

if __name__ == "__main__":
    sync_s3_incremental()

关键细节说明

  • 时区处理:一定要用UTC时间对比!如果你的本地机器是其他时区,直接用datetime.datetime.now()会导致时间判断错误,漏掉或多下载文件。
  • 跳过虚拟文件夹:S3没有真实的文件夹,以/结尾的键是虚拟目录,我们需要跳过这些,避免创建空的目录文件。
  • 自动创建目录:用os.makedirs(..., exist_ok=True)可以自动创建本地缺失的子目录,不用手动处理路径问题。
  • 参数配置:记得替换代码中的LOCAL_PATH、S3_BUCKET_NAME和S3_FOLDER_PREFIX为你的实际信息。

定时运行脚本

要实现每小时自动运行,你可以用系统自带的定时任务工具:

  • Linux/macOS:用cron,添加如下任务(编辑crontab -e):
    0 * * * * /usr/bin/python3 /path/to/your/script.py >> /var/log/s3_sync.log 2>&1
    
    这个配置会在每小时的第0分钟运行脚本,并把日志输出到指定文件。
  • Windows:用「任务计划程序」创建一个基本任务,设置触发条件为「每小时」,操作为启动你的Python脚本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:37:21