为什么数据未传入createframe函数 向SQLite写入Binance数据无表生成问题
问题排查及解决方案
核心错误点(按优先级排序)
- 语法错误直接导致程序无法启动:
relevant列表推导式未补全右方括号,且过滤逻辑冗余,正确写法为relevant = [symbol for symbol in non_lev if symbol.endswith('USDT')]- 循环条件的布尔值拼写错误,
while true需改为Python标准写法while True(首字母大写) - 事件循环变量拼写错误,
lop.run_until_complete(main())需改为loop.run_until_complete(main()) to_sql方法参数拼写错误,if_exist需改为if_exists
- 数据推送规则错误导致收不到有效数据:
币安WebSocket的K线订阅通道必须指定时间周期,仅写@kline无法触发推送,需补充周期参数,例如订阅1分钟K线改为multi = [i.lower() + '@kline_1m' for i in relevant] - 字段取值逻辑错误导致解析失败:
币安K线推送的核心字段存储在msg['data']['k']层级下,你当前直接从msg['data']取s、E、p字段不存在,会直接抛出KeyError中断程序,createframe函数修正为:def createframe(msg): k_data = msg['data']['k'] df = pd.DataFrame([k_data]) # 字段对应:s=交易对、t=K线开盘时间、c=K线收盘价,可按需调整字段 df = df.loc[:,['s', 't', 'c']] df.columns = ['symbol', 'Time', 'Price'] df.Price = df.Price.astype(float) df.Time = pd.to_datetime(df.Time, unit='ms') return df
通用调试建议
- 接收数据后先打印原始数据结构验证:在
res = await tscm.recv()后添加print(res),确认能正常收到推送后再做解析逻辑 - 添加异常捕获避免程序意外中断,处理数据部分修改为:
if res: try: frame = createframe(res) # 用iloc[0]避免pandas索引警告 frame.to_sql(frame.symbol.iloc[0], engine, if_exists='append', index=False) except Exception as e: print(f"处理错误: {e}, 原始数据: {res}")
内容的提问来源于stack exchange,提问作者dccb
相关产品推荐
相关产品推荐

