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

