如何从含子文件夹的Google Cloud Storage存储桶中提取文件夹名称
如何从GCS存储桶的Blob路径中提取唯一的文件夹名称?
我们有一个包含子文件夹的Google Cloud Storage(GCS)存储桶,子文件夹下包含文件。目前使用以下Python代码可以列出存储桶中所有Blob的完整路径:
from google.cloud import storage def list_blobs(bucket_name): """Lists all the blobs in the bucket.""" bucket_name = "my_bucket" storage_client = storage.Client() # Note: Client.list_blobs requires at least package version 1.17.0. blobs = storage_client.list_blobs(bucket_name) for blob in blobs: print(blob.name)
执行该函数后得到的结果为:
'folder1/data.csv', ' folder1/data2.csv', ' folder1/data4.csv', 'folder2/data3.csv', ' folder2/data5.csv', ' folder3/data.csv',
现在希望仅提取唯一的文件夹名称,得到如下输出:
Output : folder1 folder2 folder3
请问是否可以实现该需求?
当然可以实现,这里提供两种实用方案:
方案一:遍历所有Blob并提取去重
通过处理每个Blob的名称,提取第一个斜杠前的部分作为文件夹名,并用集合自动去重:
from google.cloud import storage def list_unique_folders(bucket_name): storage_client = storage.Client() blobs = storage_client.list_blobs(bucket_name) unique_folders = set() for blob in blobs: # 跳过无路径分隔符的文件(如果存在) if '/' in blob.name: folder = blob.name.split('/')[0] unique_folders.add(folder) # 按名称排序后输出 for folder in sorted(unique_folders): print(folder) # 调用函数,传入你的存储桶名称 list_unique_folders("my_bucket")
说明:
- 利用集合
set()的特性自动去重,确保每个文件夹只出现一次 split('/')[0]精准提取Blob路径中的第一级文件夹名称- 使用
sorted()可以让输出的文件夹名称按字母顺序排列,按需选择
方案二:直接请求GCS获取文件夹前缀(更高效)
如果存储桶中存在明确的文件夹对象(即创建了以/结尾的Blob),可以通过delimiter参数直接向GCS请求文件夹前缀,无需遍历所有文件:
from google.cloud import storage def list_folders_directly(bucket_name): storage_client = storage.Client() bucket = storage_client.get_bucket(bucket_name) # 设置delimiter='/',让API返回所有第一级文件夹前缀 blob_iterator = bucket.list_blobs(delimiter='/') # 遍历前缀并去除末尾的斜杠 for prefix in blob_iterator.prefixes: print(prefix.rstrip('/')) list_folders_directly("my_bucket")
说明:
- 这种方法更高效,尤其适合文件数量多的存储桶,减少本地处理的开销
list_blobs(delimiter='/')会让GCS API返回所有第一级文件夹的前缀,无需手动拆分路径
内容的提问来源于stack exchange,提问作者Jerry Vfc
相关产品推荐
相关产品推荐

