使用Boto3 Python无法删除S3所有子文件夹下的指定文件
解决AWS S3多目录下指定文件批量删除问题
场景说明
AWS S3存储桶adityadataretention中,客户端ID523180下有如下目录结构:
adityadataretention/523180/source=shopify/yr=2022/mth=10/:包含test1.csv、test2.csvadityadataretention/523180/source=channel/yr=2022/mth=10/:包含test1.csv、test2.csv
需求是批量删除source=shopify和source=channel这两个路径下的test2.csv文件。
初始代码问题
最初的Boto3代码只能处理单个目录下的文件删除,直接循环执行时会误删所有文件(包括test1.csv),核心问题是没有精准过滤目标文件,循环逻辑未限定操作范围。
修正后的可行代码
import boto3 def delete_target_s3_files(): # 初始化S3客户端 s3_client = boto3.client('s3') bucket = 'adityadataretention' # 定义需要处理的目标前缀路径 target_prefixes = [ '523180/source=shopify/yr=2022/mth=10/', '523180/source=channel/yr=2022/mth=10/' ] filename_to_delete = 'test2.csv' for prefix in target_prefixes: # 列出前缀下的所有对象 response = s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix) if 'Contents' not in response: print(f"路径 {prefix} 下无文件或不存在") continue # 筛选出目标文件 objects_to_delete = [ {'Key': obj['Key']} for obj in response['Contents'] if obj['Key'].endswith(filename_to_delete) ] if objects_to_delete: # 批量删除文件 s3_client.delete_objects( Bucket=bucket, Delete={'Objects': objects_to_delete} ) print(f"成功删除 {prefix} 下的 {filename_to_delete}") else: print(f"路径 {prefix} 下未找到 {filename_to_delete}") if __name__ == "__main__": delete_target_s3_files()
关键优化点
- 明确指定要遍历的前缀路径,缩小操作范围,避免无关目录被影响
- 通过
endswith(filename_to_delete)精准匹配目标文件,彻底避免误删其他文件 - 使用
delete_objects批量删除,比单个删除更高效 - 添加状态打印,方便跟踪每一步操作结果
内容的提问来源于stack exchange,提问作者addytheriot
相关产品推荐
相关产品推荐

