如何用Python3+Boto3高效从AWS S3拉取含偶数分钟的CSV文件
优化S3偶数分钟文件拉取的方案
你的核心问题是重复调用S3列表接口导致耗时过长——原代码每小时发起30次API请求,每次只查一个分钟前缀的文件,大量时间浪费在网络交互上。最优方案是一次拉取该小时下的所有文件,本地过滤偶数分钟的目标文件,把API请求次数从30次降到1次。
优化思路
- 缩小API调用范围:只构造到小时级别的前缀(比如
2024_05_20_10_),一次列出该小时下的所有CSV文件。 - 本地过滤逻辑:从文件名中提取分钟部分,判断是否为偶数,筛选出目标文件。
- 统一收集符合条件的文件Key,后续批量下载。
优化后的代码
paginator = self.s3.get_paginator('list_objects') files = set() # 构造小时级前缀,一次拉取该小时所有文件 hour_prefix = '{:%Y_%m_%d_%H_}'.format(self.date) pages = paginator.paginate(Bucket=self.bucket, Prefix=hour_prefix) for page in pages: if not page.get('Contents'): continue for item in page['Contents']: file_key = item['Key'] # 按下划线分割文件名,提取分钟部分(格式:Year_Month_Date_Hour_Minute.csv) parts = file_key.split('_') if len(parts) < 5: continue # 跳过格式不符合的文件 # 取分钟部分(分割后最后一段是Minute.csv,拆分出分钟数字) minute_str = parts[-1].split('.')[0] try: minute = int(minute_str) if minute % 2 == 0: files.add(file_key) except ValueError: continue # 跳过分钟部分不是数字的异常文件
关键说明
- API请求优化:仅1次
paginate调用,拉取该小时下所有文件,避免多次网络往返。 - 过滤逻辑:通过字符串分割提取分钟值,判断奇偶性,本地操作几乎无耗时。
- 容错处理:增加了文件名格式校验和异常捕获,避免因非法格式文件导致程序中断。
内容的提问来源于stack exchange,提问作者Yash Mulchandani
相关产品推荐
相关产品推荐

