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

使用Boto3 Python无法删除S3所有子文件夹下的指定文件

解决AWS S3多目录下指定文件批量删除问题

场景说明

AWS S3存储桶adityadataretention中,客户端ID523180下有如下目录结构:

  • adityadataretention/523180/source=shopify/yr=2022/mth=10/:包含test1.csv、test2.csv
  • adityadataretention/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:30:51