You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Google Cloud Function在GCS中创建CSV并写入URL内容

问题根因&修正方案

核心错误点

  • Blob路径构造错误:GCS的bucket.blob()方法接收的参数是桶内的相对路径,不需要额外拼接桶名,你在路径前加了bucket_name + '/'会导致新文件生成到错误路径,甚至触发权限问题
  • 直接使用open()操作GCS路径:open()是本地文件系统的读写方法,无法直接操作GCS上的对象,GCS是对象存储不是块存储,你需要先把生成的CSV内容写入内存/本地临时目录,再上传到GCS
  • compose接口使用冗余:compose是用来合并多个已有GCS对象的接口,你的场景不需要用到,直接上传生成好的CSV内容即可

修正后可运行代码

import os.path
import csv
from csv import DictReader, DictWriter
from google.cloud import storage
from io import StringIO

def generate_urls(data, context):
    if context.event_type == 'google.storage.object.finalize':
        storage_client = storage.Client()
        bucket_name = data['bucket']
        bucket = storage_client.get_bucket(bucket_name)
        target_folder = 'my-folder'
        file_name = data['name']

        # 校验文件类型和所属文件夹,避免其他文件触发逻辑
        if not file_name.endswith('.csv') or not file_name.startswith(f'{target_folder}/'):
            return

        # 第一步:下载源CSV内容
        source_blob = bucket.blob(file_name)
        source_content = source_blob.download_as_string().decode('utf-8')
        input_io = StringIO(source_content)
        csv_dict_reader = DictReader(input_io)

        # 第二步:在内存中生成转换后的CSV内容
        output_io = StringIO()
        csv_writer = DictWriter(output_io, fieldnames=['URL'], delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
        csv_writer.writeheader()
        line_count = 0
        for row in csv_dict_reader:
            line_count += 1
            # 此处写入你自己的URL转换逻辑
            url = ''
            csv_writer.writerow({'URL': url})
        print(f'Total rows: {line_count}')

        # 第三步:构造新文件路径,上传到GCS
        path_splits = file_name.rsplit('/', 1)
        if len(path_splits) == 2:
            folder, raw_filename = path_splits
            new_blob_path = f'{folder}/URL_{raw_filename}'
        else:
            new_blob_path = f'URL_{file_name}'
        destination_blob = bucket.blob(new_blob_path)
        destination_blob.content_type = 'text/csv'
        destination_blob.upload_from_string(output_io.getvalue())

额外注意事项

  • Cloud Function运行环境只有/tmp目录具备写入权限,如果你要处理GB级大CSV,可以先把生成的内容写入/tmp下的临时文件,再调用upload_from_filename方法上传
  • 可以根据需要配置新文件的存储类别、访问权限,在upload时传入对应参数即可

内容的提问来源于stack exchange,提问作者EhMaMuffin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:24:04