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

Python Discord bot写入user id到json报TypeError列表索引错误求助

报错根因

报错触发于vote_list[userid] = []行,核心问题如下:

  • 本地vote.json文件当前存储的是JSON数组(对应Python list类型),但代码将其作为字典(dict)操作,试图用字符串类型的userid作为列表索引赋值,不符合列表的操作规则。
  • 正则提取得到的user变量为字符串类型,若你需要使用数值类型的Discord用户ID作为键,还需额外做类型转换。
修复步骤
  1. 调整vote.json初始内容,将原有[]替换为{},保证JSON读取后为字典类型,支持键值对操作。
  2. 给读写JSON的逻辑增加容错处理,避免文件不存在、内容格式损坏时触发崩溃。
  3. 可选优化:将用户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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 07:51:00