如何通过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
相关产品推荐
相关产品推荐

