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

基于Python与JSON文件的图书管理器开发求助

图书管理器实现方案与JSON文件操作指南

一、解决JSON数据覆盖问题的核心逻辑

你遇到的覆盖问题,是因为每次写入时直接用'w'模式覆盖了整个文件,正确的流程是:

  1. 读取现有数据(如果文件存在)到列表中
  2. 将新图书数据追加到列表
  3. 将整个列表重新写入文件

核心代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.01 13:14:52