gpt4 book ai didi

python - 如何列出给定 GCS 存储桶中的所有顶级文件夹?

转载 作者:行者123 更新时间:2023-12-01 06:39:22 25 4
gpt4 key购买 nike

我从

开始
    client = storage.Client()
bucket = client.get_bucket(BUCKET_NAME)

<what's next? Need something like client.list_folders(path)>

我知道如何:

  1. 列出 bucket.list_blobs() 的所有 Blob(包括任意深度的子子子文件夹中的 Blob)

  2. 或者如何使用 bucket.list_blobs(prefix=<path to subfolder>) 递归列出给定文件夹中的所有 blob

但是如果我的文件系统结构有100怎么办?顶级文件夹,每个文件夹都有数千个文件。任何有效的方法只获得那些100顶级文件夹名称而不列出所有内部 blob?

最佳答案

这里的所有响应都有一个答案,但您需要组合:前缀分隔符前缀加载的 list_blobs(...) 迭代器。让我写下获取 100 个顶级文件夹的代码,然后我们将逐步介绍它。

import google.cloud.storage as gcs
client = gcs.Client()
blobs = client.list_blobs(
bucket_or_name=BUCKET_NAME,
prefix="",
delimiter="/",
max_results=1
)
next(blobs, ...) # Force list_blobs to make the api call (lazy loading)
# prefixes is now a set, convert to list
print(list(blobs.prefixes)[:100])

在前八行中,我们构建 GCS 客户端并进行 client.list_blobs(...) 调用。在您的问题中,您提到了 bucket.list_blobs(..) 方法 - 从版本 1.43 开始,这仍然有效,但是 the page on Buckets in the docs说这现在已被弃用。唯一的区别是第 4 行的关键字 arg bucket_or_name

我们希望文件夹位于顶层,因此我们实际上根本不需要指定前缀,但是,对于其他读者来说,如果您想列出文件夹,这将很有用在顶级目录 stuff 中,那么您应该指定尾部斜杠。这个 kwarg 将变成 prefix="stuff/"

有人已经提到了 delimiter kwarg,但是为了迭代,您应该指定它,以便 GCS 知道如何将 blob 名称解释为目录。足够简单。

max_results=1 是为了提高效率。请记住,我们在这里不需要 blob,我们只需要文件夹名称。因此,如果我们告诉 GCS 一旦发现单个 Blob 就停止寻找,它可能会更快。在实践中,我还没有发现这种情况,但如果你有大量的 Blob ,或者存储是冷线或其他什么,很可能会出现这种情况。 YMMV。考虑它是可选的。

返回的 blob 对象是一个延迟加载迭代器,这意味着它不会加载(甚至不会填充其成员),直到进行第​​一个 api 调用。为了获得第一次调用,我们要求迭代器中的 next 元素。就您而言,您知道您至少有一个文件,因此只需调用 next(blobs) 即可。它获取队列中的下一个(位于行的前面)的 blob,然后将其丢弃。

但是,如果您不能保证至少有一个 blob,则需要从迭代器返回某些内容的 next(blobs) 将引发 StopIteration异常(exception)。为了解决这个问题,我们设置了省略号的默认值 ...

现在我们想要的 blob 成员 prefixes 已加载,我们打印出前 100 个。输出将类似于:

{'dir0/','dir1/','dir2/', ...}

关于python - 如何列出给定 GCS 存储桶中的所有顶级文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59526251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com