【问题标题】:Python way of setting a s3 subdirectory path and deleting it using boto设置 s3 子目录路径并使用 boto 删除它的 Python 方法
【发布时间】:2021-03-22 21:43:39
【问题描述】:

我有如下路径:

s3://edl-landing/lu/hello2/  

下面有两张表,如下图:


现在,每个表都有以下文件夹格式的parquet 数据:

现在,我想删除10th and 11th November 的数据。所以,下面是我使用boto 客户端的python 代码,但它不会从S3 中删除对象。我没有收到任何错误。另外,我尝试了this link 的各种解决方案,但它也没有从 S3 中删除实际数据。

prefix = "lu/hello2/"
s3 = boto3.resource('s3')
bucket = s3.Bucket(name="edl-landing")
FilesNotFound = True
blankList=[]
for obj in bucket.objects.filter(Prefix=prefix):
     #print(obj.key)
     blankList.append(obj.key.split('/')[2])
blankList = set(blankList) // 2 names
while ("" in blankList):
  blankList.remove("")
datesList = ['2020-11-10','2020-11-11']
for i in blankList:
  for j in datesList:
    path = "s3://edl-landing/lu/hello2/"+i+"/edl_load_ts="+j+"/"
    print(path)
    bucket.objects.filter(Prefix=path).delete()
    print("All the objects have been deleted for the mentioned dates...")

我哪里错了?我通过 EC2 实例运行它。

【问题讨论】:

    标签: python amazon-web-services amazon-s3 amazon-ec2


    【解决方案1】:

    您将完整的 S3 URI 传递给 bucket.objects.filter(Prefix=path)

    此函数需要 S3 对象前缀,而不是 S3 URI。

    您应该能够验证您的代码尝试删除零个对象,因为bucket.objects.filter(Prefix=path) 返回了零个对象。

    传递相关前缀:"lu/hello2/"+i+"/edl_load_ts="+j+"/"

    【讨论】:

    • 好吧,让我试试。实际上我是 AWS 概念的新手,所以对此一无所知
    • 没问题。看起来您在之前对 bucket.objects.filter() 的调用中得到了正确的前缀。
    • 是的,我通过的路径是正确的。那我应该通过什么?路径变量还是您建议的变量?
    • 传递正确的 S3 密钥前缀。好像是"lu/hello2/"+i+"/edl_load_ts="+j+"/"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2021-07-27
    • 2013-10-15
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    相关资源
    最近更新 更多