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

discord.py:机器人加入服务器时如何写入数据到JSON文件

问题分析与解决方案

你的代码存在几个核心问题,导致无法写入JSON文件:

  • 文件打开模式错误:使用'r'只读模式打开文件,根本没有写入权限,而且未处理文件不存在的场景(首次运行会直接报错)。
  • 错误的存在性检查逻辑:直接判断str(guild.id) in sdb是在检查服务器ID是否在文件的行迭代器中,而非JSON数据的键里,逻辑完全错误。
  • 未读取原有数据:每次都新建空字典data = {},就算写入也会覆盖掉已有的服务器配置。
  • 缺少写入操作:仅定义了data字典,但从未执行将数据写入文件的代码。

修正后的完整代码:

import json
import os

@bot.event
async def on_guild_join(guild):
    file_path = 'database\\serverdb.json'
    # 确保存放JSON的目录存在,避免路径不存在报错
    os.makedirs('database', exist_ok=True)
    
    # 读取现有数据,文件不存在则初始化空字典
    try:
        with open(file_path, 'r', encoding='utf-8') as sdb:
            data = json.load(sdb)
    except FileNotFoundError:
        data = {}
    
    guild_id = str(guild.id)
    if guild_id not in data:
        # 添加新服务器的配置项
        data[guild_id] = {
            'test3': 0,
            'test2': 1,
            'test': 1
        }
        print("added")
        # 将更新后的数据写入文件
        with open(file_path, 'w', encoding='utf-8') as sdb:
            json.dump(data, sdb, indent=4)
    else:
        print("found")
    print("workie")

关键修正说明:

  • 用os.makedirs自动创建database目录,避免因目录不存在导致的文件操作失败。
  • 使用try-except捕获文件不存在的情况,自动初始化空配置字典。
  • 用json.load读取文件中的现有配置,保留已添加的服务器数据。
  • 正确检查服务器ID是否在配置字典的键中,逻辑符合需求。
  • 使用with语句管理文件,自动处理文件的打开/关闭,避免资源泄漏。
  • 用json.dump将更新后的配置写入文件,indent=4让JSON内容格式化,方便查看。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:24:50