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
相关产品推荐
相关产品推荐

