You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:07:36