如何从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()
关键改动说明:
- 保留完整S3对象:不再分割key成字符串,保留
obj对象以访问其last_modified属性 - 正确处理前缀:给前缀添加结尾的
/,避免误匹配名称包含该前缀的文件 - 过滤目录对象:排除前缀本身对应的"目录"占位对象
- 准确提取文件名:用
obj.key.split('/')[-1]获取不带路径的文件名,再用fnmatch筛选 - 使用S3原生时间属性:通过
last_modified(datetime类型)比较文件修改时间,取最新文件
内容的提问来源于stack exchange,提问作者sidewinder
相关产品推荐
相关产品推荐

