Python - 列出存储桶中的文件和文件夹

Python - List files and folders in Bucket

我正在使用 boto 库来访问 amazon s3 存储桶。我正在尝试列出存储桶中给定文件夹中的所有文件和文件夹。我用它来获取所有文件和文件夹:

for key in bucket.list():
    print key.name

这为我提供了根目录中的所有文件和文件夹,以及其中包含文件的子文件夹,如下所示:

root/
 file1
 file2
 folder1/file3
 folder1/file4
 folder1/folder2/file5
 folder1/folder2/file6

如何只列出 say folder1 的内容,其中会列出如下内容:

files:
 file3
 file4

folders:
 folder2

我可以使用

导航到文件夹
for key in in bucket.list(prefix=path/to/folder/)

但在那种情况下,它会将 folder2 中的文件列为 folder1 中的文件,因为我正在尝试在存储桶路径上使用字符串操作。我已经尝试了每一种情况,但如果路径较长并且文件夹有多个文件和文件夹(并且这些文件夹有更多文件),它仍然会中断。有没有递归的方法来处理这个问题?

S3没有可能想到的"folders"的概念。它是一个单级层次结构,其中文件按键存储。

如果您需要在文件夹内进行单级列表,则必须在代码中限制该列表。类似于 if key.count('/')==1

我发现关于 S3 最难完全理解的是它只是一个 key/value store 而不是大多数人熟悉的磁盘或其他类型的基于文件的存储。人们将键称为文件夹,将值称为文件这一事实有助于在使用它时产生最初的混淆。

作为 key/value 商店,键只是标识符,而不是进入目录结构的实际路径。这意味着您不需要在引用文件夹之前实际创建文件夹,因此您只需将对象放入存储桶中 /path/to/my/object 之类的位置,而无需先创建 "directory" /path/to/my.

因为 S3 是一个 key/value 存储,所以与其交互的 API 更多地基于对象和散列而不是基于文件。这意味着,无论是使用 Amazon 的原生 API 还是使用 boto,s3.bucket.Bucket.list 之类的函数都会列出存储桶中的所有对象,并可选择根据前缀进行过滤。如果您指定前缀 /foo/bar,那么将列出所有带有该前缀的内容,包括 /foo/bar/file/foo/bar/blargh/file/foo/bar/1/2/3/file 等。

所以简短的回答是,您需要从对 s3.bucket.Bucket.list 的调用中过滤掉您不想要的结果,因为像 s3.bucket.Bucket.lists3.bucket.Bucket.get_all_keys等都是为了return你指定为过滤器的前缀下的所有key。

所有的信息都是其他答案是正确的,但是因为很多人在 S3 中存储带有类似路径键的对象,API 确实提供了一些工具来帮助您处理它们。

例如,在您的情况下,如果您只想列出 root 的 "subdirectories",而不列出下面的所有对象,您可以这样做:

for key in bucket.list(prefix='root/', delimiter='/'):
    print(key.name)

应该产生输出:

file1
file2
folder1/

然后你可以这样做:

for key in bucket.list(prefix='root/folder1/', delimiter='/'):
    print(key.name)

并得到:

file3
file4
folder2/

等等。您可能可以用这种方法完成您想要的。