1. 获取客户端对象的访问权限。
代码在哪里运行?
我(某个位置)在Google Cloud Platform(GCP)内部
如果您正在从GCP内部访问Google Cloud Storage(GCS),例如Google Kubernetes Engine(GKE),则应使用工作负载身份将您的GKE服务帐号配置为充当GCS服务帐号。 https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity
一旦您完成这个步骤,创建您的客户端就像这样简单:
import google.cloud.storage as gcs
client = gcs.Client()
走出GCP
如果你不在GCP内,比如在AWS、Azure、本地开发环境或其它地方,那么需要选择以下两种方式之一:要么创建一个服务账号并下载该账号的json文件(其中含有加密的私钥),要么使用工作负载身份联合,如AWS、Azure等提供的功能。
假设你决定下载新的GCS服务账号文件至/secure/gcs.json
。
PROJECT_NAME = "MY-GCP-PROJECT"
from google.oauth2.service_account import Credentials
import google.cloud.storage as gcs
client = gcs.Client(
project=PROJECT_NAME,
credentials=Credentials.from_service_account_file("/secure/gcs.json"),
)
2. 发送列出文件夹的请求到GCS
在这个操作中,我们试图获取存储桶abc
中路径xyz
内的文件夹列表。请注意,GCS中的路径不像Linux那样以/
开头,但是它们应该以一个/
结束。因此,我们将查找带有前缀xyz/
的文件夹。也就是说,只是文件夹,而不是包含所有子文件夹的文件夹。
BUCKET_NAME = "abc"
blobs = client.list_blobs(
BUCKET_NAME,
prefix="xyz/", # <- you need the trailing slash
delimiter="/",
max_results=1,
)
注意我们只要求一个 blob,这不是一个错误:blobs 是文件本身,我们只对文件夹感兴趣。将 max_results
设置为零并不起作用,详见下文。
3. 强制懒加载工作!
这里的一些回答遍历了迭代器中的每个元素 blobs
,可能会遍历成千上万个,但我们不需要这样做。话虽如此,如果我们没有遍历任何元素,则 blobs
不会进行向 GCS 发出 API 请求的操作。
next(blobs, ...)
print(blobs.prefixes)
blobs
变量是一个迭代器,最多包含一个元素,但是如果您的文件夹(在其级别上)没有文件,则可能没有元素。如果没有元素,则
next(blobs)
将引发
StopIteration
异常。
第二个参数,省略号
...
,只是我选择的默认返回值,如果没有下一个元素。我觉得这比
None
更可读,因为它向读者暗示着这里发生了值得注意的事情。毕竟,请求值后立即在同一行中丢弃它的代码具有潜在错误的所有标志,因此让我们向读者保证这是有意为之的是很好的。
最后,假设我们在
xyz
下有一个树形结构,即
aaa
、
bbb
、
ccc
,然后在
ccc
下面有子文件夹
zzz
。输出将会是:
{'xyz/aaa', 'xyz/bbb', 'xyz/ccc'}
请注意,根据 OP 的要求,我们不会看到子文件夹
xyz/ccc/zzz
。
xyz
文件夹内的文件夹,但是命令gsutil ls gs://abc/xyz
返回xyz
中的所有对象,包括非文件夹项。那么,你要求的是什么?所有文件夹还是所有项目,包括文件夹? - Robino