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操作字典数据
修复步骤
按照你的需求,正确逻辑是操作字典的键值对,步骤如下:
- 直接读取JSON为字典,不要套列表
- 构造对应用户的键(和income.json格式一致:
| 用户名,注意前后空格) - 获取用户当前余额(首次操作默认0),转整数后加上随机数
- 更新字典中该用户的余额值,再写入JSON文件
- 发送消息时把整数转成字符串,避免类型错误
修复后的完整代码
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
相关产品推荐
相关产品推荐

