如何在python-binance的WebSocket回调中正确引用BNB余额数据?
修正Binance WebSocket余额数据的引用问题
嘿,问题很明确啦!你出错的原因是没搞清楚msg["B"]的结构——它不是单个字典,而是一个字典组成的列表,所以直接用msg["B"]["f"]肯定会报错,列表可不能用字符串键来访问哦~
为什么原代码不行?
看你给出的返回数据:
{"e":"outboundAccountPosition","E":1600502318390,"u":1600502318389,"B":[{"a":"BTC","f":"0.00000000","l":"0.00000000"},{"a":"BNB","f":"0.00000000","l":"0.00000000"},{"a":"XTZ","f":"0.00000000","l":"0.00000000"}]}
"B"对应的是一个数组,里面每个元素才是对应币种的余额字典(包含"a"币种符号、"f"可用余额、"l"冻结余额)。你需要先定位到数组中"a"等于"BNB"的那个元素,再去取它的"f"字段。
解决方案1:遍历列表查找(直观易理解)
适合刚接触这类数据结构的同学,逻辑清晰:
def callback_function(msg): if msg['e'] == 'outboundAccountPosition': # 遍历B数组里的每一条余额记录 for balance_item in msg["B"]: # 找到币种为BNB的记录 if balance_item["a"] == "BNB": print(f"BNB可用余额: {balance_item['f']}") break # 找到目标后停止遍历,节省资源
解决方案2:用next()函数快速定位(简洁高效)
更Pythonic的写法,适合熟悉列表推导式的同学,一行就能定位目标:
def callback_function(msg): if msg['e'] == 'outboundAccountPosition': # 从B数组中找到第一个a字段为BNB的字典,找不到则返回None bnb_balance = next((item for item in msg["B"] if item["a"] == "BNB"), None) if bnb_balance: print(f"BNB可用余额: {bnb_balance['f']}") else: print("未查询到BNB的余额信息")
这两种写法都能正确获取到BNB的f字段值,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Mitch
相关产品推荐
相关产品推荐

