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
相关产品推荐
相关产品推荐

