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

Cloud Function从API生成CSV后上传至Cloud Storage报错求助

核心问题排查

你代码里的上传失败由两个低级逻辑错误直接导致:

  • pd.DataFrame.to_csv() 传入本地路径作为参数时,返回值为None。你将返回值重新赋值给了存储DataFrame的new_list变量,后续执行open(new_list, "w")相当于传入空值作为文件路径,直接触发参数异常。
  • 你已经通过to_csv将完整的结构化数据写入了/tmp/temp.csv,后续手动打开文件写入字符串Data for CSV file的操作会直接覆盖原有CSV内容,属于完全冗余的错误逻辑。

优化修复后代码

import requests
import pandas as pd
from flatsplode import flatsplode
import numpy as np
import datetime
from google.cloud import storage

api_url = 'https://[YOUR_DOMAIN].com/api/v2/[API_KEY]/keywords/list?site_id=[SITE_ID][&start={start}][&results=100]&format=json'

def export_data(url):
    response = requests.get(url)
    payload = response.json()

    # 处理JSON转为DataFrame并删除冗余列
    new_list = pd.DataFrame(list(flatsplode(payload)))
    idx = np.r_[1:5,14:27,34,35]
    new_list = new_list.drop(new_list.columns[idx], axis=1)

    # 写入CSV到临时目录,不覆盖原有变量
    temp_csv_path = '/tmp/temp.csv'
    # 新增index=False避免输出多余的索引列
    new_list.to_csv(temp_csv_path, index=False, encoding='utf-8')

    # GCS上传逻辑
    def upload_blob(bucket_name, source_file_path, destination_blob_name):
        storage_client = storage.Client()
        bucket = storage_client.bucket(bucket_name)
        blob = bucket.blob(destination_blob_name)
        # 直接使用路径上传,无需手动处理文件句柄
        blob.upload_from_filename(source_file_path)

    upload_blob('data-exports', temp_csv_path, f'data-{datetime.date.today()}.csv')

export_data(api_url)

额外注意事项

  • 请确认Cloud Function的默认运行服务账号,拥有data-exports存储桶的storage.objects.create权限,否则会触发权限拒绝类报错。
  • 原代码中导入的schedule、csv、tempfile等未使用依赖可以删除,降低函数冷启动耗时。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:42:00