【问题标题】:How to delete files that matches a specific pattern in S3 bucket?如何删除与 S3 存储桶中特定模式匹配的文件?
【发布时间】:2019-10-21 21:42:58
【问题描述】:

我有一个 S3 存储桶,我正在保存 CSV 文件以将它们加载到 Redshift。为此,我使用 PythonBoto3。将它们加载到 Redshift 后,我​​想删除与包含我的代码的处理 ID 的模式匹配的特定文件。

我将文件保存到 S3 存储桶中,如下所示

Redshift{processingID}-table1.csv
Redshift{processingID}-table2.csv
Redshift{processingID}-table3.csv
Redshift{processingID}-table4.csv

处理完那些包含特定 ID 的文件后,我想从我的 S3 存储桶中删除处理过的文件。如何指定模式。

这是我试图从存储桶中删除文件的模式。

Redshift11-*.csv。这里 11processingID。如何使用 boto3 删除所有匹配模式的文件?

我遇到过这个。 https://stackoverflow.com/a/53836093/4626254

但它似乎是在搜索文件夹作为前缀,而不是文件的确切模式。

【问题讨论】:

  • 模式是什么?它总是位于同一个文件夹下吗?
  • 是的。这些文件将始终位于存储桶的根目录中。
  • 比您指出的前缀技巧应该有效。 Prefix (string) -- Limits the response to keys that begin with the specified prefix. 由于您的文件始终位于根文件夹下,因此应该可以。试一试,让我们知道。
  • 当然@Amit。会让你知道。谢谢。

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


【解决方案1】:

您可以在服务器端进行前缀过滤,但您必须在客户端进行后缀过滤。例如:

import boto3
s3 = boto3.resource('s3')

bucket = s3.Bucket('mybucket')
files = [os.key for os in bucket.objects.filter(Prefix="myfolder/Redshift11-")]
csv_files = [file for file in files if file.endswith('.csv')]

print(f'All files: {files}')
print(f'CSV files: {csv_files}')

【讨论】:

    【解决方案2】:

    没有办法告诉 S3 删除符合特定模式的文件 - 您只需一次删除一个文件。您可以列出具有特定前缀的键

    例如: Redshiftapplication_name_used_as_prefix) 通过修改文件命名以具有唯一前缀。

    或者如果您需要依赖正则表达式,那么您必须指定开始和结束规则,例如:

    import re
    
    pattern = r"Redshift([0-9]+)-(\w+).csv$"
    re.match(pattern, 'Redshift2-table1.csv')
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2016-07-12
      • 2012-04-20
      • 2015-06-23
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多