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

如何从S3存储桶中获取特定模式的最后修改文件名?

解决S3指定目录下按最后修改时间筛选特定模式文件的问题

你的代码存在几个关键问题,导致无法按最后修改时间筛选文件:

  • 你将S3对象的key分割成字符串存入files_in_s3,后续试图调用字符串的stat()方法——这肯定会报错,因为只有本地文件对象才有这个属性,S3对象的最后修改时间是last_modified属性
  • 筛选逻辑顺序错误,应该先保留完整的S3对象,再过滤符合文件名模式的项,最后再按时间排序

修正后的代码如下:

import boto3
import fnmatch
import optsconfig  # 假设该模块已正确配置

def filename_retrieve():
    # 初始化S3资源
    s3_resource = boto3.resource('s3',
                    aws_access_key_id=optsconfig.aws_access_key_id,
                    aws_secret_access_key=optsconfig.aws_secret_access_key,
                    )

    bucket_name = optsconfig.SOURCE_CONTACT_BKT
    folder_prefix = optsconfig.s3_SC_OPTS_archive
    # 确保前缀以/结尾,避免匹配到同名前缀的文件
    if not folder_prefix.endswith('/'):
        folder_prefix += '/'

    s3_bucket = s3_resource.Bucket(bucket_name)
    # 获取指定前缀下的所有S3对象,排除目录本身(S3无真实目录,仅为key前缀)
    s3_objects = [obj for obj in s3_bucket.objects.filter(Prefix=folder_prefix) 
                  if obj.key != folder_prefix]

    # 筛选符合文件名模式的对象
    matched_objects = [obj for obj in s3_objects 
                       if fnmatch.fnmatch(obj.key.split('/')[-1], '*_LEAD_*.csv')]

    if not matched_objects:
        print("没有找到符合模式的文件")
        return

    # 按最后修改时间倒序排序,取第一个(最新的)
    latest_obj = max(matched_objects, key=lambda x: x.last_modified)
    # 输出不带路径的文件名,如需完整S3 key直接用latest_obj.key
    print(f"最新的符合条件的文件: {latest_obj.key.split('/')[-1]}")

filename_retrieve()

关键改动说明:

  1. 保留完整S3对象:不再分割key成字符串,保留obj对象以访问其last_modified属性
  2. 正确处理前缀:给前缀添加结尾的/,避免误匹配名称包含该前缀的文件
  3. 过滤目录对象:排除前缀本身对应的"目录"占位对象
  4. 准确提取文件名:用obj.key.split('/')[-1]获取不带路径的文件名,再用fnmatch筛选
  5. 使用S3原生时间属性:通过last_modified(datetime类型)比较文件修改时间,取最新文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:15:29