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

