Discord机器人JSON文件KeyError问题求助:KeyError: '370034734186758173'
解决XP排行榜中的KeyError问题
嘿,这个KeyError问题我太熟了——说白了就是你代码在找'370034734186758173'这个用户ID时,发现它根本不在你的JSON数据里,或者你找它的方式不对。咱们一步步来排查修复:
1. 先确认JSON数据的核心问题
首先得搞清楚这个用户ID到底在不在你的JSON文件里:
- 可能是类型不匹配:比如JSON里的用户ID是数字(
370034734186758173),但你代码里用字符串('370034734186758173')去访问,这俩在Python里是完全不同的键,自然会报错。- 修复:统一类型就行。要么读取JSON后把所有键转成字符串(比如
str(user_id)),要么访问时用和JSON里一致的类型。
- 修复:统一类型就行。要么读取JSON后把所有键转成字符串(比如
- 也可能这个用户的数据压根没被写入JSON:比如用户刚发言但数据保存逻辑出了问题,没把他的ID加进去。这时候得检查你的数据写入代码,确保所有发言用户的信息都能正确存到JSON里。
2. 给字典访问加个“安全垫”
如果你的代码需要处理可能不存在的用户ID,别直接用data[user_id]这种硬访问方式,试试这俩安全方法:
- 用字典的
get()方法:xp = data.get(user_id, 0),要是键不存在,就返回默认值0(你也可以改成其他合适的默认值,比如初始等级1),不会抛出错误。 - 用
try-except捕获错误:
try: user_info = data[user_id] except KeyError: # 键不存在时初始化这个用户的信息 data[user_id] = {"xp": 0, "level": 1} user_info = data[user_id]
3. 检查JSON文件有没有损坏
有时候程序崩溃、写入中断会导致JSON文件损坏,部分数据丢失。你可以:
- 手动打开JSON文件,搜索
370034734186758173,看看它是否存在,格式是不是正确(比如有没有漏逗号、引号)。 - 读取JSON时加个错误捕获,避免读取损坏的数据:
import json with open('user_xp.json', 'r') as f: try: user_data = json.load(f) except json.JSONDecodeError: # 文件损坏就初始化空字典 user_data = {}
最后给你个简单的示例代码,展示如何安全读取数据并生成排行榜:
import json # 安全读取JSON数据 with open('user_xp.json', 'r') as f: try: user_data = json.load(f) except json.JSONDecodeError: user_data = {} # 按XP排序生成排行榜 rankings = sorted( [(user_id, info.get('xp', 0)) for user_id, info in user_data.items()], key=lambda x: x[1], reverse=True ) # 输出排行榜 print("📊 XP排行榜:") for rank, (user_id, xp) in enumerate(rankings, 1): print(f"{rank}. 用户ID {user_id}:{xp} 经验值")
内容的提问来源于stack exchange,提问作者kami
相关产品推荐
相关产品推荐

