Python Discord bot写入user id到json报TypeError列表索引错误求助
报错根因
报错触发于vote_list[userid] = []行,核心问题如下:
- 本地
vote.json文件当前存储的是JSON数组(对应Python list类型),但代码将其作为字典(dict)操作,试图用字符串类型的userid作为列表索引赋值,不符合列表的操作规则。 - 正则提取得到的user变量为字符串类型,若你需要使用数值类型的Discord用户ID作为键,还需额外做类型转换。
修复步骤
- 调整
vote.json初始内容,将原有[]替换为{},保证JSON读取后为字典类型,支持键值对操作。 - 给读写JSON的逻辑增加容错处理,避免文件不存在、内容格式损坏时触发崩溃。
- 可选优化:将用户ID转为整数类型存储,匹配Discord用户ID的数值属性。
修正后参考代码
import json import re def addUpvoteRecord(userid): # 增加异常处理兼容异常场景 try: with open("vote.json", "r", encoding="utf-8") as f: vote_list = json.load(f) # 格式校验,非字典则重置 if not isinstance(vote_list, dict): vote_list = {} except (FileNotFoundError, json.JSONDecodeError): vote_list = {} if userid not in vote_list: vote_list[userid] = [] with open("vote.json", "w", encoding="utf-8") as f: json.dump(vote_list, f, ensure_ascii=False, indent=2) @client.event async def on_message(message) : if message.channel.id == 870147153706750022 : data = message.content.split(" ") user = re.sub("\D", "", data[5]) # 若需要存储整数类型用户ID,取消下方注释即可,建议增加user非空判断避免转换错误 # user = int(user) addUpvoteRecord(user) await client.process_commands(message)
内容的提问来源于stack exchange,提问作者Varchasva Khare
相关产品推荐
相关产品推荐

