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

Python创建存储归还图书JSON文件报KeyError: 'returnedbooks'如何解决

问题原因

  • 代码中的data变量没有提前初始化,也没有从已有的JSON文件中读取历史内容,直接访问data['returnedbooks']必然触发KeyError
  • 使用a+模式直接写入JSON是错误方案:JSON要求整个文件为一个合法的独立结构,每次追加json.dump的内容会导致文件内存在多个独立JSON对象,后续无法正常解析
  • 没有处理文件不存在、文件为空的场景,没有初始化{"returnedbooks": []}的基础结构

修正方案

调整读写逻辑:每次写入前先读取已有历史数据,无数据时初始化基础结构,添加新记录后覆盖写入整个JSON文件,保证结构合法。修正后的完整代码如下:

import json
from datetime import datetime

returnedbooksJsonPath = 'returnedbooks.json'

class ReturnedBook(BookItem):
  def __init__(self, book_id, returned_date):
    self.__book_id = book_id
    self.__returned_date = returned_date

  def get_returned_date(self):
    return self.__returned_date

  def get_book_id(self):
    return self.__book_id

  def record_returned_book(self):
    # 读取已有数据,无文件/空文件/文件损坏时用初始结构
    data = {"returnedbooks": []}
    try:
        with open(returnedbooksJsonPath, 'r', encoding='utf-8') as f:
            data = json.load(f)
    except (FileNotFoundError, json.JSONDecodeError):
        pass
    
    # 追加新的归还记录
    data['returnedbooks'].append({
        'book_id': self.__book_id,
        'returned_date': self.__returned_date,
    })
    
    # 覆盖写入整个JSON文件,保证结构合法
    with open(returnedbooksJsonPath, 'w', encoding='utf-8') as f:
        json.dump(data, f, indent=4, default=str)
    
    return "You have successfully returned the book"


r = ReturnedBook("32", datetime.now())
r.record_returned_book()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:57:02