使用Python+AWS Chalice接收TradingView webhook数据转存CSV相关问题
报错根因说明
ValueError: If using all scalar values, you must pass an index
该报错来自pandas的DataFrame构造逻辑:你直接把单条JSON字典(所有值都是字符串、数字这类标量)传入pd.DataFrame()时,pandas默认将字典key识别为列名,没有行索引的情况下无法构造二维表结构,因此要求显式传入index参数。TypeError: Object of type DataFrame is not JSON serializable
该报错来自AWS Chalice的响应序列化逻辑:Chalice要求路由返回值必须是可直接JSON序列化的对象,你如果将DataFrame直接作为路由返回值,Chalice自动转JSON响应时会失败,触发该报错。
修复方案
你可以直接复用以下代码逻辑,同时解决两个报错,适配动态字段的webhook数据:
from chalice import Chalice import pandas as pd import os app = Chalice(app_name='tradingview-webhook') # 替换为你自己的本地CSV存储路径 CSV_SAVE_PATH = "D:/trading_signals/log.csv" @app.route('/receive-signal', methods=['POST']) def handle_signal(): # 接收TradingView传入的动态JSON数据 signal = app.current_request.json_body # 修复第一个报错:将单条字典套入列表后再构造DataFrame,pandas会自动生成行索引 df = pd.DataFrame([signal]) # 写入CSV逻辑:文件存在就追加写入不重复写表头,不存在就新建文件写表头 file_exist = os.path.exists(CSV_SAVE_PATH) df.to_csv( CSV_SAVE_PATH, mode="a", header=not file_exist, index=False, encoding="utf-8-sig" ) # 修复第二个报错:返回可JSON序列化的字典作为响应,不要返回DataFrame对象 return {"code": 0, "msg": "signal saved"}
优化建议
如果不需要做复杂的数据处理,你可以直接用Python内置csv模块实现需求,依赖更轻量,也不会遇到pandas相关的报错:
import csv # 上述路由中写入部分替换为以下代码即可 file_exist = os.path.exists(CSV_SAVE_PATH) with open(CSV_SAVE_PATH, "a", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=signal.keys()) if not file_exist: writer.writeheader() writer.writerow(signal)
动态字段适配说明:如果新传入的webhook有之前没有的字段,写入时旧行对应新字段的位置会自动填充空值,不会报错;如果你需要统一所有字段的顺序,可以提前定义好全量字段列表,传入fieldnames参数即可。
内容的提问来源于stack exchange,提问作者Ms Kaishi
相关产品推荐
相关产品推荐

