如何使用 boto3 检查 S3 密钥是否为空?

How can I check if an S3 key is empty using boto3?

S3 本身不支持文件夹,但可以用空键模拟它们。所以我可以通过创建一个键而不是设置一个值来创建一个新文件夹:

bucket.new_key('directory')

我想确定这样的键是目录还是文件。我认为这可以通过检查密钥的内容是否为空来完成,但我不知道如何做。

S3 doesn't support folders natively but they can be emulated with empty keys.

这只在非常有限的范围内是正确的。

键引用 0 字节(空)对象这一事实只是一个副作用。重要的因素是键名以 /.

结尾

An object named with a trailing "/" displays as a folder in the Amazon S3 console.

http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

所以,您的测试很简单:如果键以 / 结尾,那就是假装的文件夹占位符。

普通对象可以是空的(只是一个 "empty file,",例如没有报告任何内容的日志记录操作的输出),因此空不是有效的测试。

但这对你有什么作用?

they can be emulated

以上仅与 S3 控制台相关。

  • 通过创建这样一个对象完成的唯一一件事就是给控制台一个文件夹的图片来显示,这样你就可以点击它把文件放在那里,但是

  • 如果已经有具有相同前缀的对象,那么控制台已经在那里显示了一个文件夹,并且

  • 您可以通过编程方式创建对象 pics/funny/cat.jpg 而无需先创建 pics/pics/funny/ 并且 S3 对它们的处理方式与您创建文件夹占位符时没有区别,和

  • 删除这样的对象不会删除 "folder" 的 "contents"(所以这不会 "emulate" 那个意义上的文件夹) , 和

  • 删除此类对象不会从控制台中删除文件夹图标,除非存储桶中不再有具有该前缀的对象。

您不需要这些占位符对象来处理存储桶中的对象,就像它们是分层的一样。

列表对象请求 API 允许您指定 prefix,例如 myfolder/ 以获取 myfolder/ 中所有对象的列表,包括所有子文件夹中的对象,或者,如果您指定 delimiter/,您将仅收到该文件夹​​中的对象,而不是子文件夹中的对象。

这些API操作不需要创建这些特殊对象。

S3 不支持 actual 文件夹,因为 S3 中没有存储 "inside" 或 "under" 其他东西。这是为了可扩展性。但是,S3 使用 API 中内置的 delimiter 处理逻辑支持 逻辑 文件夹。