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

discord.py报错TypeError:需传入整数却得到字符串,求助

问题解决:discord.py余额命令TypeError及逻辑错误修复

核心错误解析

你碰到的TypeError: an integer is required (got type str),根源是open()函数参数用错了——open()的第三个参数是缓冲区大小(必须是整数),但你传了字符串"w"。除此之外,代码里还有好几处逻辑问题,一起给你修正:

修复步骤

1. 重构get_balance_data()函数

原函数的问题:

  • 用"w"模式打开文件会直接清空内容,后续json.loads()读空内容必报错
  • 错误地同时传"r"和"w"作为模式参数
  • 没处理文件不存在的情况

修复后代码:

import json
import os

async def get_balance_data():
    # 没有文件就创建并初始化空字典
    if not os.path.exists("balance.json"):
        with open("balance.json", "w") as f:
            json.dump({}, f)
    
    # 只读模式读取数据
    with open("balance.json", "r") as balance_file:
        users = json.load(balance_file)
    
    return users

2. 修正balance命令逻辑

原命令的问题:

  • 重复打开balance.json(get_balance_data()已经处理)
  • discord.Embed的参数是title不是titles
  • 错误地把余额直接赋值为0(应该先检查用户是否存在,不存在再初始化)
  • 没保存更新后的余额数据

修复后命令:

@client.command(aliases=['bal'])
async def balance(ctx):
    user = ctx.author
    users = await get_balance_data()
    
    # 用户不在数据里就初始化余额
    if str(user.id) not in users:
        users[str(user.id)] = {"balance": 0}
        # 把更新后的数据写回文件
        with open("balance.json", "w") as f:
            json.dump(users, f)
    
    user_balance = users[str(user.id)]["balance"]
    
    embed = discord.Embed(title=f"{ctx.author.name}'s Balance", color=discord.Color.blue())
    embed.add_field(name="Current Balance", value=user_balance)
    await ctx.send(embed=embed)

3. 额外注意

  • 必须导入json和os模块
  • 机器人运行目录要有读写权限,不然没法创建/修改balance.json
  • 原代码里get_balance_data()的json.dump(users, balance)完全多余,会搞乱文件内容,已经删掉

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:36:25