使用 boto3 翻页匹配特定文件名的 S3 对象

afi*_*ert 4 python paging amazon-s3 amazon-web-services boto3

我有一个带有前缀(或“文件夹”)的 AWS S3 存储桶,名为/photos. 那“包含”一堆图像文件,甚至更少的EVENT.json文件。一个简单的表示可能如下所示:

  • 我的真棒事件桶
    • 相片
      • 图片1.jpg
      • 图片2.jpg
      • 1_EVENT.json
      • 图片3.jpg
      • 2_EVENT.json
      • ...

这些EVENT.json文件有一个对象,该对象包含对任意数量图像文件的路径引用,这些文件将图像分组到特定事件中。使用上面的示例,image1.jpg 和 image2.jpg 可能出现在 1_EVENT.json 中,而 image3.jpg 可能属于 2_EVENT.json。

随着存储桶变大,我对分页结果感兴趣。我只想在需要时从 S3 请求一个页面。我遇到的问题是我想通过包含“EVENT”一词的键专门进行分页。我发现如果不带回所有对象然后过滤或迭代结果,这很难完成。

使用S3 Paginator,我可以让分页工作。假设我的PageSizeMaxItems设置为 6,这就是我可能会在第一页返回的内容:

/photos/
/photos/image1.jpg
/photos/image2.jpg
/photos/1_EVENT.json
/photos/image3.jpg
/photos/2_EVENT.json
Run Code Online (Sandbox Code Playgroud)

S3的扁平结构意味着它根据Prefix对bucket中的所有对象进行分页,并根据分页参数进行限制和分页。这意味着我可以轻松获得多个 EVENT.json 文件,或者根本没有,具体取决于页面。

所以我正在寻找更多类似的东西:

/photos/1_EVENT.json
/photos/2_EVENT.json
/photos/3_EVENT.json
/photos/4_EVENT.json
/photos/5_EVENT.json
/photos/6_EVENT.json
Run Code Online (Sandbox Code Playgroud)

无需首先请求所有对象,然后以某种方式对结果集进行切片;这正是我目前正在做的事情:

/photos/
/photos/image1.jpg
/photos/image2.jpg
/photos/1_EVENT.json
/photos/image3.jpg
/photos/2_EVENT.json
Run Code Online (Sandbox Code Playgroud)

上面的内容非常昂贵,没有分页,但它确实给了我一个包含我的“事件”搜索字符串的所有文件的列表。

我特别希望的页面结果只有通过S3使用boto3,而无需返回和过滤所有对象的每个请求的开销EVENT.json对象。那可能吗?

编辑:我已经将请求范围缩小到带有photos/前缀的对象。这是因为我的存储桶中还有其他“文件夹”也可能包含 EVENT 文件。这阻止了我使用 EVENT 或 EVENT.json 作为我的前缀,因为响应可能会被其他文件夹中的文件污染。

小智 5

最简单的方法是重新散列文件名结构,让 EVENT 文件遵循模式photos/EVENT_*.json而不是photos/*_EVENT.json. 然后你可以使用一个公共前缀photos/EVENT.

除此之外,我认为您使用的昂贵方法实际上是唯一的方法。