模块 boto 的 list() 方法中的问题

Issue in list() method of module boto

我将列表方法用作:

all_keys = self.s3_bucket.list(self.s3_path)

存储桶 "s3_path" 包含文件和文件夹。上一行的 return 值令人困惑。它是 returning:

  1. 父目录
  2. 几个目录不全
  3. 文件夹和子文件夹中的所有文件。

我原以为它只会 return 个文件。

Amazon S3 中实际上没有 文件夹 这样的东西。它只是为了方便而提供的。即使具有该路径的文件夹不存在,对象也可以存储在给定路径中。对象的 Key 是完整路径加上文件名。

例如,即使文件夹不存在,这也会复制一个文件:

aws s3 cp file.txt s3://my-bucket/foo/bar/file.txt

这不会创建 /foo/bar 文件夹。它只是创建一个对象,其 Key 为:/foo/bar/file.txt

但是,如果文件夹是在 S3 管理控制台中创建的,则会使用文件夹的名称创建一个零长度文件,以便它显示在控制台中。列出文件时,这个会出现作为目录名,但它实际上是一个零长度文件的名称。

这就是为什么某些目录可能会出现但其他目录不会出现的原因 -- 这取决于它们是否是专门创建的,或者它们的对象是否只是存储在该路径中。

底线: Amazon S3 是一个对象存储系统。它实际上只是一个很大的 Key/Value 存储——键是对象的名称,值是对象的内容。不要假设它与传统文件系统一样工作。

如果桶中有很多项目,list_objects 的结果将被分页。默认情况下,它将 return 最多 1000 个项目。请参阅 Boto docs 以了解如何使用 Marker 对所有项目进行分页。

哦,看起来你在使用 Boto 2。对你来说,它将是 BucketListResultSet