[英]Google Cloud Function: Access folders in a Google Storage bucket and process files from them
我是 GCP 的新手,我正在尝试编写一个 Google Cloud Function,一旦新文件出现在存储桶中,它就会被触发。 我做了这个工作,但问题是 Cloud Function 还应该执行另一个操作:它需要访问一个已经存在于存储桶中的文件夹(这意味着,在触发器发生之前:这个文件夹被称为data_folders
并且包含更多文件夹—— 0_42_ten
、 1_42_ten
、 2_42_ten
;我想从data_folders
访问1_42_ten
一个,这样我就可以从中加载文件)。 我的问题是我无法以“看到” data_folders
文件夹的方式设置 Cloud Function。
这是我正在使用的代码(我重写了代码以专注于仅访问“旧”文件夹):
from google.cloud import storage
import glob
def hello_gcs(event, context):
"""Triggered by a change to a Cloud Storage bucket.
Args:
event (dict): Event payload.
context (google.cloud.functions.Context): Metadata for the event.
"""
file = event
print("Function triggered")
storage_client = storage.Client()
bucket = storage_client.bucket("bucket_name")
blob = bucket.blob("bucket_name/data_folders")
print(blob)
def list_folders():
path = 'bucket_name/data_folders'
list_of_folders = glob.glob(path)
sorted_folders = sorted(list_of_folders)
print(sorted_folders)
list_folders()
云 Function 已成功部署,但随后(当我使用“测试”选项卡对其进行测试并将{"name": "data_folders"}
作为输入传递时)它返回一个空列表(而不是 ['0_42_ten', '1_42_ten' , '2_42_ten'] 左右),表明它没有“看到” data_folders
或其中的文件夹。 我尝试使用路径格式(例如gs://bucket_name/data_folders
、 bucket_name/data_folders/*
等),但没有任何效果。
有人可以告诉我如何解决这个问题吗?
正如在评论列表中提到的那样,使用glob
不能像本地文件系统那样工作。
因此,在 GCS(Google 云存储)上的 object 存储中的某个虚拟文件夹下列出对象的最小示例可能如下所示:
#!/usr/bin/env python
from google.cloud import storage
import os
BUCKET_NAME = os.getenv("BUCKET_NAME", "the-bucket")
BUCKET_PATH = os.getenv("BUCKET_PATH", "the-path")
print(f"BUCKET_NAME={BUCKET_NAME} BUCKET_PATH={BUCKET_PATH}")
print(f"via CLI: gsutil ls -l gs://{BUCKET_NAME}/{BUCKET_PATH}/")
storage_client = storage.Client()
bucket = storage_client.bucket(BUCKET_NAME)
content_list = list(bucket.list_blobs(prefix=f"{BUCKET_PATH}/"))
print(content_list)
请注意:如果指定的文件夹不直接包含对象(或 blob),那么在 GCS 的情况下,这个 function 会在树中找到这些对象。 那最终可能会在另一层文件夹中。
因此,如果对象存储有如下路径:
gcs://the-bucket/the-path/sub-folder/object.csv.gz
该文件由bucket.list_blobs(prefix="the-path/")
列出
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.