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

Python写入JSON工单数据触发KeyError问题排查修复

问题原因

KeyError触发的核心逻辑是:你尝试访问字典中不存在的键。
你的代码直接执行data[str(ticket.id)]["author"] = ctx.author.id,默认data里已经存在键为当前工单ID的条目,但新建工单时这个ID是第一次生成,JSON文件中没有对应记录,解释器找不到data[str(ticket.id)]对应的字典对象,自然无法给它的author键赋值。
另外你给出的目标JSON结构存在语法错误,键和值之间必须加冒号,合法结构如下:

{
    "random_channel_id": {
        "author": "random_user_id"
    }
}
修复方案

修复逻辑:写入作者ID前先检查工单ID对应的键是否存在,不存在就先初始化空字典,再执行赋值。同时补充基础的容错逻辑,避免存储文件不存在、JSON格式损坏导致程序崩溃。
修复后的完整代码:

import json
import os

# 初始化存储目录和文件,避免首次运行找不到文件报错
os.makedirs("data", exist_ok=True)
if not os.path.exists("data/tickets.json"):
    with open("data/tickets.json", "w", encoding="utf-8") as f:
        json.dump({}, f, indent=4, ensure_ascii=False)

# 读取现有工单数据
with open("data/tickets.json", "r", encoding="utf-8") as f:
    try:
        data = json.load(f)
    except json.JSONDecodeError:
        # JSON内容损坏时重置为空数据
        data = {}

ticket_key = str(ticket.id)
# 新工单先初始化对应存储对象
if ticket_key not in data:
    data[ticket_key] = {}
# 写入创建者ID
data[ticket_key]["author"] = ctx.author.id

# 写回文件
with open("data/tickets.json", "w", encoding="utf-8") as f:
    json.dump(data, f, indent=4, ensure_ascii=False)
注意事项
  • Windows环境下文件读写必须指定encoding="utf-8",否则会用系统默认GBK编码,遇到特殊字符容易出现乱码
  • 如果工单创建并发量高,建议给JSON文件读写加异步锁,避免多协程同时写入导致文件内容覆盖、格式损坏
  • 后续如果工单需要存储的字段增多、查询场景变复杂,建议替换为SQLite等轻量数据库,比JSON文件稳定性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 23:54:18