加密交易扫描器开发中Numpy数组字符串转整数无输出问题求助
问题原因
- 核心错误是类型转换逻辑不兼容币安返回的行情数据格式:币安K线接口返回的成交价字段(c/h/l)都是带小数位的字符串(例:
"29800.45"),你先转float再用format()处理后得到的仍是带小数点的字符串,直接对这类字符串调用int()会抛出ValueError异常。你之前测试用的是纯整数字符串所以能正常运行,碰到带小数点的行情数据就会失败。 - WebSocket回调函数默认不会主动打印异常信息,异常抛出后会直接静默中断逻辑执行,所以你看不到转换后的数组输出,甚至可能出现连接无提示断开的情况。
- 额外优化点:用列表推导式遍历numpy数组转类型的写法效率极低,属于不必要的冗余操作。
解决方案
- 转换类型时先将字符串转成float,再转int,避免带小数点的字符串直接转int报错
- 直接用numpy内置的
astype()方法做批量类型转换,性能更高写法更简洁 - 在回调函数中增加异常捕获逻辑,方便后续问题排查
修正后代码
import numpy as np import websocket, json socket = "wss://stream.binance.com:9443/ws/btcusdt@kline_1m" closelist = [] def on_open(ws): print('连接已开启') def on_close(ws, close_status_code, close_msg): print('连接已关闭') def on_message(ws, message): global closelist try: json_message = json.loads(message) candle = json_message['k'] is_candle_closed = candle['x'] close = candle['c'] high = candle['h'] low = candle['l'] if is_candle_closed: # 直接转float后存列表,不需要先format成字符串 closelist.append(float(close)) closelist.append(float(high)) closelist.append(float(low)) # 转numpy数组后直接转int类型 b = np.array(closelist).astype(int) print(b) print(type(b)) print(type(b[1])) except Exception as e: # 打印异常方便排查 print(f"处理消息出错: {e}") ws = websocket.WebSocketApp(socket, on_open=on_open, on_message=on_message, on_close=on_close) ws.run_forever()
内容的提问来源于stack exchange,提问作者Jellyfish
相关产品推荐
相关产品推荐

