Python开发Discord货币机器人无法写入.json文件问题求助
问题排查与修复方案
核心错误点
- 文件打开模式错误:所有执行
json.dump写入文件的代码行,open()均未指定写入模式,Python默认以只读r模式打开文件,无法写入任何内容,这是文件始终为空的最直接原因。 - 工具函数被错误添加指令装饰器:内部调用的
get_bank_data函数被加了@client.command()装饰器,导致该函数无法正常被其他函数异步调用返回JSON数据,会触发逻辑异常。 - 缺少初始文件兼容逻辑:如果首次运行时没有提前创建
kromerbank.json并写入空对象{},会直接抛出文件不存在的报错。
修复后的完整代码
import json import os import random import discord from discord.ext import commands client = commands.Bot(command_prefix="?") os.chdir('/home/runner/spamtonbot/') # 新增初始文件校验逻辑,避免首次运行报错 if not os.path.exists("kromerbank.json"): with open("kromerbank.json", "w", encoding="utf-8") as f: json.dump({}, f) @client.event async def on_ready(): print("Ready") @client.command() async def balance(ctx): await open_account(ctx.author) user = ctx.author users = await get_bank_data() wallet_amt = users[str(user.id)]["wallet"] bank_amt = users[str(user.id)]["bank"] em = discord.Embed(title=f"{ctx.author.name}'s balance", color=discord.Color.red()) em.add_field(name="wallet balance", value=wallet_amt) em.add_field(name="bank balance", value=bank_amt) await ctx.send(embed=em) @client.command() async def beg(ctx): await open_account(ctx.author) users = await get_bank_data() user = ctx.author earnings = random.randrange(101) await ctx.send("Someone gave you {} kromer!".format(str(earnings))) users[str(user.id)]["wallet"] += earnings # 修复:指定写模式打开文件 with open("kromerbank.json", "w", encoding="utf-8") as f: json.dump(users, f, ensure_ascii=False, indent=4) async def open_account(user): users = await get_bank_data() if str(user.id) in users: return False else: users[str(user.id)] = {} users[str(user.id)]["wallet"] = 0 users[str(user.id)]["bank"] = 0 # 修复:指定写模式打开文件 with open("kromerbank.json", "w", encoding="utf-8") as f: json.dump(users, f, ensure_ascii=False, indent=4) return True # 修复:移除错误的指令装饰器 async def get_bank_data(): with open("kromerbank.json", "r", encoding="utf-8") as f: users = json.load(f) return users # 填入你的机器人Token运行 client.run("你的机器人Token")
额外优化说明
- 写入JSON时添加了
indent=4参数,格式化JSON内容方便调试查看,ensure_ascii=False兼容后续可能出现的中文字符 - 统一添加了
encoding=utf-8参数避免不同系统下的编码乱码问题
内容的提问来源于stack exchange,提问作者Ryan K
相关产品推荐
相关产品推荐

