【问题标题】:S3 boto3 delete files except a specific fileS3 boto3 删除特定文件以外的文件
【发布时间】:2021-09-04 06:10:05
【问题描述】:

可能这只是一个新手问题。

我有一个使用 boto3 sdk 的 python 代码,我需要从 s3 存储桶中删除除一个文件之外的所有文件。

问题在于用户正在更新此 S3 存储桶并将一些文件放入一些文件夹中。复制这些文件后,我需要删除它们,因此这里的问题是文件夹也被删除,因为云提供商上没有文件夹的概念。我需要保持“文件夹”结构完整。我正在考虑在每个“文件夹”中放置一个虚拟文件,并将该文件排除在删除之外。

这是可行的吗?

【问题讨论】:

  • 为什么需要保持“文件夹”结构完整?
  • 因为它们是由用户手动更新的。如果我删除文件夹,那么他将不得不手动重新创建文件夹,这很麻烦。
  • 请注意,S3 中通常不需要文件夹。您不需要文件夹即可上传文件。您只需使用所需的密钥上传文件,任何新的中间文件夹层次结构都是隐式的。
  • 也许我没有更好地解释我的用例。我必须以自动方式(Python、rsync 等)将 S3 中的一些文件同步到 GCS,因此最终用户上传的文件总是驻留在那个“文件夹结构”中,我需要那个结构,因为每个S3 中的文件夹映射到 GCS 中的存储桶。移动文件后,我需要从 S3 中删除它们(因此问题就在这里),但保留文件夹,以便第二天用户可以将其他文件上传到这些文件夹中。我希望这次我解释得更好一点。

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


【解决方案1】:

如果您创建一个与您希望以 / 结尾的文件夹同名的零字节对象,它将在 AWS 控制台中显示为一个空文件夹,而其他枚举由前缀分隔的对象的工具将在他们的常用前缀列表中查看前缀:

s3 = boto3.client('s3')
s3.put_object(Bucket='example-bucket', Key='example/folder/', Body=b'')

然后,当您枚举要删除的对象列表时,请忽略以/ 结尾的任何对象,因为这只是您用于文件夹的标记:

s3 = boto3.client('s3')
resp = s3.list_objects_v2(Bucket='example-bucket', Prefix='example/folder/')
for cur in resp['Contents']:
    if cur['Key'].endswith('/'):
        print("Ignoring folder marker: " + cur['Key'])
    else:
        print("Should delete object: " + cur['Key'])
        # TODO: Delete this object

【讨论】:

    【解决方案2】:
    for file in files_in_bucket:
        if file.name != file_name_to_keep:
            file.delete()
    

    可以在你的脚本中遵循这种逻辑吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      相关资源
      最近更新 更多