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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:06:08