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

