【问题标题】:Python - List files and folders in BucketPython - 列出存储桶中的文件和文件夹
【发布时间】:2015-02-13 17:24:59
【问题描述】:

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

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

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

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

我怎样才能只列出folder1 的内容,其中会列出如下内容:

files:
 file3
 file4

folders:
 folder2

我可以使用

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    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/
    

    等等。通过这种方法,您可能可以完成您想要的。

    【讨论】:

    • 我认为这可能只适用于 Boto 2。
    【解决方案2】:

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

    作为键/值存储,键只是标识符,而不是目录结构的实际路径。这意味着您不需要在引用它们之前实际创建文件夹,因此您可以简单地将对象放入存储桶中的位置,例如/path/to/my/object,而无需先创建“目录”/path/to/my

    因为 S3 是一个键/值存储,与其交互的 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 等函数都旨在返回所有键在您指定为过滤器的前缀下。

    【讨论】:

      【解决方案3】:

      S3 没有想象中的“文件夹”概念。它是一个单级层次结构,文件按密钥存储。

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

      【讨论】:

        猜你喜欢
        • 2018-04-19
        • 2023-01-20
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 2016-10-29
        • 1970-01-01
        • 2020-01-24
        • 1970-01-01
        相关资源
        最近更新 更多