Python操作JSON存储Discord用户数据报TypeError问题排查求助
问题根因
报错和功能异常来自三处逻辑错误:
- 读写逻辑和JSON存储格式不匹配:你的
wallet.json采用的是单个数组包裹所有用户记录的标准JSON结构,不是逐行存储独立JSON对象的JSONL格式。原有逐行读取+逐行json.loads的逻辑,会把整个用户数组作为单个元素存入edit列表,此时edit[0]本身就是存储所有用户的列表,你用字符串"id"作为索引访问列表,就会抛出TypeError: list indices must be integers or slices, not str。 - 写入逻辑错误:原有代码使用
r+模式打开文件,既没有把新用户记录追加到现有用户数组中,也没有清空文件原有内容,直接写入单条用户对象会破坏JSON结构,后续读取必然失败。 - 未处理边界场景:初始空文件状态下直接做JSON解析会触发解析错误,没有做兜底初始化。
修复后代码
原有Nextcord、Embed、消息响应的逻辑完全保留,仅修正JSON读写部分:
import json import nextcord # 保留你原有的bot初始化、其他导入逻辑即可 @bot.command() async def start(ctx): current_user_id = str(ctx.author.id) # 读取现有用户数据,空文件/文件不存在/格式损坏时兜底为空数组 try: with open("wallet.json", "r", encoding="utf-8") as f: user_records = json.load(f) except (json.JSONDecodeError, FileNotFoundError): user_records = [] # 校验用户是否已注册 for record in user_records: if record["id"] == current_user_id: await ctx.reply("You already have an account") return # 原有Embed发送逻辑完全不变 embed = nextcord.Embed(title = "Blablabla", description = "Blablabla") embed.set_footer(text = "Blablabla") await ctx.send(embed = embed) # 追加新用户记录 new_user = {"id": current_user_id, "gold": 0, "fyre": 0, "faction": None} user_records.append(new_user) # 全量覆写文件,保证JSON结构合法 with open("wallet.json", "w", encoding="utf-8") as f: json.dump(user_records, f, indent=2, ensure_ascii=False)
补充说明
修复后wallet.json会始终保持你预期的数组结构,和你给出的示例格式完全一致。后续其他功能操作这个文件时,直接用json.load一次性读取整个数组即可,不需要再做逐行读取处理。全量覆写的写入方式也避免了文件指针位置不对、内容拼接导致的格式损坏问题。
内容的提问来源于stack exchange,提问作者Energia360
相关产品推荐
相关产品推荐

