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

Python操作JSON存储Discord用户数据报TypeError问题排查求助

问题根因

报错和功能异常来自三处逻辑错误:

  • 读写逻辑和JSON存储格式不匹配:你的wallet.json采用的是单个数组包裹所有用户记录的标准JSON结构,不是逐行存储独立JSON对象的JSONL格式。原有逐行读取+逐行json.loads的逻辑,会把整个用户数组作为单个元素存入edit列表,此时edit[0]本身就是存储所有用户的列表,你用字符串"id"作为索引访问列表,就会抛出TypeError: list indices must be integers or slices, not str。
  • 写入逻辑错误:原有代码使用r+模式打开文件,既没有把新用户记录追加到现有用户数组中,也没有清空文件原有内容,直接写入单条用户对象会破坏JSON结构,后续读取必然失败。
  • 未处理边界场景:初始空文件状态下直接做JSON解析会触发解析错误,没有做兜底初始化。
修复后代码

原有Nextcord、Embed、消息响应的逻辑完全保留,仅修正JSON读写部分:

import json
import nextcord
# 保留你原有的bot初始化、其他导入逻辑即可

@bot.command()
async def start(ctx):
    current_user_id = str(ctx.author.id)
    # 读取现有用户数据,空文件/文件不存在/格式损坏时兜底为空数组
    try:
        with open("wallet.json", "r", encoding="utf-8") as f:
            user_records = json.load(f)
    except (json.JSONDecodeError, FileNotFoundError):
        user_records = []

    # 校验用户是否已注册
    for record in user_records:
        if record["id"] == current_user_id:
            await ctx.reply("You already have an account")
            return

    # 原有Embed发送逻辑完全不变
    embed = nextcord.Embed(title = "Blablabla", description = "Blablabla")
    embed.set_footer(text = "Blablabla")
    await ctx.send(embed = embed)

    # 追加新用户记录
    new_user = {"id": current_user_id, "gold": 0, "fyre": 0, "faction": None}
    user_records.append(new_user)

    # 全量覆写文件,保证JSON结构合法
    with open("wallet.json", "w", encoding="utf-8") as f:
        json.dump(user_records, f, indent=2, ensure_ascii=False)
补充说明

修复后wallet.json会始终保持你预期的数组结构,和你给出的示例格式完全一致。后续其他功能操作这个文件时,直接用json.load一次性读取整个数组即可,不需要再做逐行读取处理。全量覆写的写入方式也避免了文件指针位置不对、内容拼接导致的格式损坏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:21:31