繁体   English   中英

Google Cloud Function:访问 Google Storage 存储桶中的文件夹并处理其中的文件

[英]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_ten1_42_ten2_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_foldersbucket_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM