【问题标题】:Deleting s3 file also deletes the folder python code删除s3文件也会删除文件夹python代码
【发布时间】:2020-04-24 16:33:58
【问题描述】:

我正在尝试使用以下 python 代码删除 S3 Bucket 中文件夹内的所有文件,但该文件夹也与文件一起被删除

import boto3
s3 = boto3.resource('s3')
old_bucket_name='new-bucket'
old_prefix='data/'
old_bucket = s3.Bucket(old_bucket_name)

old_bucket.objects.filter(Prefix=old_prefix).delete()

【问题讨论】:

  • 实际上 S3 中没有“文件夹”,这只是对象在控制台中根据其键(名称)前缀显示的一种方式。如果您在控制台中创建文件夹,它将创建一个带有前缀(路径)名称的空文件。您的代码删除所有对象的键(完整路径)以前缀开头,因此没有任何东西可以表示文件夹
  • 如何在不删除我创建的文件夹的情况下删除文件?
  • 也许您可以应用另一个过滤器来仅删除密钥长度大于前缀长度的对象(我不是 python 人,不知道该怎么做)。不管文件夹只是一个前缀还是一个空文件(具有特殊的内容类型),所以也许你真的不需要那个
  • 您是否特别需要该文件夹存在?
  • @JohnRotenstein 我需要文件夹来组织不同文件夹中的不同文件,而不是创建许多存储桶。

标签: python python-3.x amazon-s3 boto3


【解决方案1】:

S3 没有文件夹。对象名称可以包含/,并且控制台将表示具有包含/ 的公共前缀的对象作为文件夹,但该文件夹实际上并不存在。如果您希望获得这种可视化表示,您可以创建一个以 / 结尾的零长度对象,这基本上相当于您通过 UI 创建文件夹时控制台所做的。

相关文档可见here

【讨论】:

  • @Nishanth 实际上 - 在控制台中,如果用户创建一个文件夹,控制台会创建一个内容类型为 application/x-directory 的空文件,并使用文件夹名称(例如 data/)作为键来显示空文件夹。但是如果没有额外的过滤器,共享代码甚至会删除特殊文件。不过我相信你可能会重新考虑是否真的需要“文件夹”
  • @gusto2 我了解文件夹的复杂性。我决定采用另一种方法(创建更多存储桶而不是文件夹)
猜你喜欢
  • 2012-04-07
  • 1970-01-01
  • 2019-08-16
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-06
  • 2018-11-09
相关资源
最近更新 更多