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

Discord.py 修改JSON指定字段时出现全文件覆盖问题求助

问题根源

你代码的核心问题出在启动时加载JSON文件的逻辑里:你把读取到的JSON数据存到了局部变量amounts中,完全没有赋值给全局的users变量。这就导致机器人重启后users一直是空的,执行complete命令时你直接给空的users[id]加status字段,自然会丢失之前存储的title等信息。

修复步骤

1. 修正启动加载JSON的逻辑

把读取到的内容赋值给全局users,同时修正文件名笔误,增加编码声明避免中文乱码:

@bot.event
async def on_ready():
    global users
    try:
        with open('users.json', 'r', encoding='utf-8') as f:
            # 将读取到的所有数据赋值给全局users变量
            users = json.load(f)
    except FileNotFoundError:
        print("找不到users.json文件,将创建新的空文件")
        users = {}

2. 优化complete命令提示

现有提示内容为空,补充任务标题显示更友好:

@bot.command(pass_context=True)
async def complete(ctx):
    id = str(ctx.message.author.id)
    if id not in users:
        await ctx.send("你还没有注册任何任务,请先使用!register命令创建")
    else:
        users[id]['status'] = "Complete"
        await ctx.send(f"任务「{users[id]['Title']}」已标记为完成")
        _save()

3. 可选优化JSON存储格式

修改_save函数,增加格式化参数,方便手动查看JSON内容:

def _save():
    with open('users.json', 'w+', encoding='utf-8') as f:
        # indent=2格式化结构,ensure_ascii=False避免中文乱码
        json.dump(users, f, indent=2, ensure_ascii=False)

补充说明

你不需要担心「重写整个JSON文件」的逻辑有问题,只要users变量里存储了所有用户的完整数据,全量重写文件就是正常的更新操作,不会丢失字段。另外注意统一字段名大小写,你注册时用的是大写开头的Title,如果要和你举例的全小写title一致,改对对应字段名即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:54:03