基于Python与JSON文件的图书管理器开发求助
图书管理器实现方案与JSON文件操作指南
一、解决JSON数据覆盖问题的核心逻辑
你遇到的覆盖问题,是因为每次写入时直接用'w'模式覆盖了整个文件,正确的流程是:
- 读取现有数据(如果文件存在)到列表中
- 将新图书数据追加到列表
- 将整个列表重新写入文件
核心代码实现
1. 读取与保存数据的工具函数
import json import os def load_books(): # 检查存储文件是否存在 if os.path.exists('books.json'): with open('books.json', 'r', encoding='utf-8') as f: try: # 读取现有图书列表 return json.load(f) except json.JSONDecodeError: # 处理文件为空或格式错误的情况 return [] else: # 文件不存在时返回空列表 return [] def save_books(books): # 将完整的图书列表写入文件 with open('books.json', 'w', encoding='utf-8') as f: json.dump(books, f, ensure_ascii=False, indent=4)
2. 各功能模块实现
添加图书
def add_book(): books = load_books() title = input("请输入书名:") author = input("请输入作者:") isbn = input("请输入ISBN:") new_book = {"title": title, "author": author, "isbn": isbn} # 用ISBN判断是否重复(可选) for book in books: if book['isbn'] == isbn: print("该ISBN的图书已存在!") return books.append(new_book) save_books(books) print("图书添加成功!")
删除图书
def delete_book(): books = load_books() if not books: print("藏书库为空,无法删除!") return isbn = input("请输入要删除图书的ISBN:") for book in books: if book['isbn'] == isbn: books.remove(book) save_books(books) print("图书删除成功!") return print("未找到该ISBN的图书!")
查看藏书库
def view_books(): books = load_books() if not books: print("藏书库为空!") return print("=== 藏书库列表 ===") for idx, book in enumerate(books, 1): print(f"{idx}. 书名:{book['title']},作者:{book['author']},ISBN:{book['isbn']}")
搜索图书
def search_book(): books = load_books() if not books: print("藏书库为空!") return keyword = input("请输入搜索关键词(书名/作者/ISBN):") results = [ book for book in books if keyword in book['title'] or keyword in book['author'] or keyword in book['isbn'] ] if not results: print("未找到匹配的图书!") return print("=== 搜索结果 ===") for idx, book in enumerate(results, 1): print(f"{idx}. 书名:{book['title']},作者:{book['author']},ISBN:{book['isbn']}")
3. 主菜单循环
def main(): while True: print("\n=== 图书管理器 ===") print("1. 添加图书") print("2. 删除图书") print("3. 查看藏书库") print("4. 搜索图书") print("5. 退出") choice = input("请输入操作编号:") if choice == '1': add_book() elif choice == '2': delete_book() elif choice == '3': view_books() elif choice == '4': search_book() elif choice == '5': print("退出程序,再见!") break else: print("输入无效,请重新输入!") if __name__ == "__main__": main()
二、Python文件操作学习要点
- 区分文件打开模式:
'r':只读,文件不存在会报错,用于读取现有内容'w':写入,会覆盖原有内容,必须确保写入的是包含全部数据的完整结构(比如包含旧数据的列表)'a':追加,适合纯文本行追加,但会破坏JSON的数组格式,因此不适合存储JSON数据
- 异常处理:用
try-except捕获JSONDecodeError、FileNotFoundError等异常,避免程序崩溃 - 编码设置:打开文件时指定
encoding='utf-8',解决中文乱码问题 - 文件存在性判断:用
os.path.exists()提前检查文件状态,是处理文件操作的基础
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

