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

discord.py中!sell命令触发IndexError的解决求助

修复discord.py !sell命令的IndexError错误

错误原因分析

触发IndexError的核心问题是完全搞错了JSON数据的处理逻辑:

  • json.load(f)读取的是字典(对应你income.json里的键值对结构),但你把它塞进了列表h = [json.load(f)],导致h是仅含1个元素的列表
  • 你用len(f'| {message.author.name} ')作为列表索引,这个长度远大于列表h的元素数量,直接触发索引越界
  • 代码逻辑完全偏离“更新用户余额”的需求,错误地用列表append操作字典数据

修复步骤

按照你的需求,正确逻辑是操作字典的键值对,步骤如下:

  1. 直接读取JSON为字典,不要套列表
  2. 构造对应用户的键(和income.json格式一致:| 用户名 ,注意前后空格)
  3. 获取用户当前余额(首次操作默认0),转整数后加上随机数
  4. 更新字典中该用户的余额值,再写入JSON文件
  5. 发送消息时把整数转成字符串,避免类型错误

修复后的完整代码

import random
import json

# 对应discord.py命令上下文
if "!sell" in message.content:
    # 生成1000-5000的随机整数
    rndm_mon = random.randrange(1000, 5000)
    # 构造与现有JSON匹配的用户键
    user_key = f"| {message.author.name} "

    # 读取JSON为字典
    with open('income.json', 'r') as f:
        income_data = json.load(f)

    # 获取当前余额,无记录则默认0,转整数计算
    current_balance = int(income_data.get(user_key, 0))
    new_balance = current_balance + rndm_mon
    # 更新字典值(转字符串保持原有格式)
    income_data[user_key] = str(new_balance)

    # 写入更新后的字典到JSON
    with open('income.json', 'w') as f:
        json.dump(income_data, f, indent=4)

    # 发送结果消息,用字符串拼接避免类型错误
    await message.channel.send(f'You Earned {rndm_mon} Dollars from selling')

验证效果

修复后执行!sell命令:

  • 若用户已在income.json中,余额会自动累加(比如原"| name ": "1716" + 随机数2000,会更新为"| name ": "3716")
  • 新用户首次操作会自动新增键值对
  • 不会再触发IndexError和字符串拼接类型错误

内容的提问来源于stack exchange,提问作者SF Mittens

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 23:54:23