如何用Python从AWS S3下载含指定子串的CSV文件?
解决AWS S3筛选下载特定子串CSV文件的问题
问题原因
你之前使用的带通配符*的S3 URI无法生效,是因为多数自定义的download_from_s3函数不会自动解析URI中的通配符,需要显式实现文件筛选逻辑。以下是两种可行的解决方案:
方案一:基于boto3手动实现筛选下载
直接使用AWS官方SDK boto3遍历目标前缀下的所有文件,筛选出包含指定子串的文件后下载:
import boto3 import os def download_filtered_s3_files(bucket_name, prefix, local_dir, filter_substring): # 初始化S3客户端 s3 = boto3.client('s3') # 创建本地目录(不存在则自动创建) os.makedirs(local_dir, exist_ok=True) # 分页列出S3前缀下的所有对象(避免大目录分页限制) paginator = s3.get_paginator('list_objects_v2') for page in paginator.paginate(Bucket=bucket_name, Prefix=prefix): if 'Contents' not in page: continue for obj in page['Contents']: file_name = os.path.basename(obj['Key']) # 筛选包含目标子串的文件 if filter_substring in file_name: local_path = os.path.join(local_dir, file_name) s3.download_file(bucket_name, obj['Key'], local_path) print(f"已完成下载: {local_path}") # 配置参数并调用 bucket = "你的Bucket名称" s3_prefix = "dir1/dir2/dir3/2020/" # 注意前缀末尾的斜杠,确保只遍历2020目录 local_directory = os.path.join("2020Data") target_substring = "BANK_NIFTY_5MINs" download_filtered_s3_files(bucket, s3_prefix, local_directory, target_substring)
方案二:基于AWS CLI的包含/排除规则下载
如果你的download_from_s3函数是封装了AWS CLI命令,可以通过--exclude和--include参数实现精准筛选:
import subprocess import os def download_from_s3_filtered(): s3_source = "s3://dir1/dir2/dir3/2020/" local_dir = os.path.join("2020Data") # 构建CLI命令:先排除所有文件,再包含符合规则的文件 cmd = [ "aws", "s3", "cp", s3_source, local_dir, "--recursive", "--exclude", "*", "--include", "BANK_NIFTY_5MINs*.csv" ] subprocess.run(cmd, check=True) # 调用函数 download_from_s3_filtered()
内容的提问来源于stack exchange,提问作者A Newbie
相关产品推荐
相关产品推荐

