【Python】简易书籍管理程序

之前简单介绍了有关Python的面向对象中的类,这次就围绕"类"和json格式来做一个简单的代码程序,并且在后面还附带了数据。

import json
import re
import timeclass BookManager:def __init__(self):self.books = {}  # 使用字典存储书籍信息,book_id# 导入书籍信息def load_books(self, filename):try:with open(filename, 'r', encoding='utf-8') as file:self.books = json.load(file)if not self.books:return  # 如果字典为空,返回except (json.JSONDecodeError, FileNotFoundError):return  # 如果文件为空,或不存在,或无法解析,直接返回def save_books(self):filename = r'books.json'with open(filename, 'w', encoding='utf-8') as file:# 没有书籍信息就不保存,并直接退出if self.books == {}:exit()# 保存书籍信息,并退出json.dump(obj=self.books, fp=file, indent=4, ensure_ascii=False)exit()def register_book(self):print("请输入书籍信息:")book_id = input("书籍ID: ")isbn = input("ISBN: ")title = input("书名: ")author = input("作者: ")genre = input("类型: ")# 检验书籍的有效性if self.validate_isbn(isbn) and \self.validate_book_id(book_id) and \book_id not in self.books.keys():self.books[book_id] = {'title': title,'author': author,'book_id': book_id,'genre': genre,'isbn': isbn}else:print("书籍ID和ISBN无效或已存在。")def delete_book_by_id(self):book_id = input("输入要删除的书籍ID: ")if book_id in self.books.keys():del self.books[book_id]print("书籍已删除。")else:print("找不到该书籍。")def modify_book(self):book_id = input("输入要修改的书籍ID: ")if book_id in self.books.keys():print("输入新的书籍信息(如果不想修改某项,请直接按回车键):")new_ISBN = input("ISBN: ")new_title = input("书名: ")new_author = input("作者: ")new_genre = input("类型: ")# 如果输入不为空,则更新相应的信息if new_ISBN:self.books[book_id]['ISBN'] = new_ISBNif new_title:self.books[book_id]['title'] = new_titleif new_author:self.books[book_id]['author'] = new_authorif new_genre:self.books[book_id]['genre'] = new_genreprint("书籍信息已更新。")else:print("找不到该书籍。")def display_books(self):# 没有书籍信息,就返回if not self.books:print("暂无书籍信息。")return# 遍历所有书籍信息print("所有书籍如下: ")for index, book in enumerate(self.books.values(), start=1):print(index, book, sep='、', end='\n')def find_book_by_id(self):book_id = input("输入书籍ID: ")if book_id in self.books.keys():print(self.books[book_id])else:print("找不到该ID的书籍信息。")def find_book_by_title(self):title = input("输入书名: ")found = Falsefor book in self.books.values():# 检查输入的书名是否为书籍标题的一部分if title in book['title']:print(f"{book}")found = Trueif not found:print("没有找到该书名的书籍。")def find_book_by_genre(self):genre = input("输入书籍类型: ")found = Falseindex = 1for book in self.books.values():# 检查输入的书名是否为书籍标题的一部分if genre in book['genre']:print(f"{index}{book}")index = index + 1found = Trueif not found:print("没有该类型书籍。")# 检验书籍的ISBN位数是否合理——13位数字def validate_isbn(self, isbn):pattern = r'^\d{13}$'return re.match(pattern, isbn) is not None# 检验书籍的ID是否符合——数字def validate_book_id(self, id):pattern = r'^\d+$'return re.match(pattern, id) is not Nonedef main():manager = BookManager()manager.load_books('books.json')# 以索引为关键字,创建一个字典来存储类方法options = {'1': manager.register_book,'2': manager.delete_book_by_id,'3': manager.modify_book,'4': manager.display_books,'5': manager.find_book_by_id,'6': manager.find_book_by_title,'7': manager.find_book_by_genre,'8': manager.save_books}while True:time.sleep(2)print("\n主菜单:")print("1. 登记书籍")print("2. 删除书籍")print("3. 修改书籍")print("4. 显示所有书籍")print("5. 按ID查找书籍")print("6. 按书名查找书籍")print("7. 按类型查找书籍")print("8. 保存并退出程序")choice = input("请选择操作: ")if choice in options.keys():options[choice]()else:print("无效选项,请重新选择。")if __name__ == '__main__':main()
{"1": {"title": "云边有个小卖部","author": "张嘉佳","book_id": "1","genre": "情感小说","isbn": "9787540487645"},"2": {"title": "月亮和六便士","author": "威廉·萨默塞特·毛姆","book_id": "2","genre": "文学经典","isbn": "9787530216787"},"3": {"title": "解忧杂货店","author": "东野圭吾","book_id": "3","genre": "悬疑小说","isbn": "9787544270878"},"4": {"title": "挪威的森林","author": "村上春树","book_id": "4","genre": "现代文学","isbn": "9787544731703"},"5": {"title": "百年孤独","author": "加西亚·马尔克斯","book_id": "5","genre": "魔幻现实主义","isbn": "9787544268103"},"6": {"title": "活着","author": "余华","book_id": "6","genre": "现实主义","isbn": "9787506365437"},"7": {"title": "小王子","author": "安托万·德·圣埃克苏佩里","book_id": "7","genre": "童话","isbn": "9787020042494"},"8": {"title": "围城","author": "钱钟书","book_id": "8","genre": "现代文学","isbn": "9787020024759"},"9": {"title": "追风筝的人","author": "卡勒德·胡赛尼","book_id": "9","genre": "现代文学","isbn": "9787208061644"},"10": {"title": "苏菲的世界","author": "乔斯坦·贾德","book_id": "10","genre": "哲学","isbn": "9787532739824"},"11": {"title": "瓦尔登湖","author": "亨利·大卫·梭罗","book_id": "11","genre": "自然写作","isbn": "9787544261098"},"12": {"title": "简爱","author": "夏洛蒂·勃朗特","book_id": "12","genre": "古典文学","isbn": "9787544242516"},"13": {"title": "1984","author": "乔治·奥威尔","book_id": "13","genre": "反乌托邦","isbn": "9787208061643"},"14": {"title": "飘","author": "玛格丽特·米切尔","book_id": "14","genre": "历史小说","isbn": "9787532745115"},"15": {"title": "动物农场","author": "乔治·奥威尔","book_id": "15","genre": "政治讽刺","isbn": "9787532739138"},"16": {"title": "荆棘鸟","author": "科琳·麦卡洛","book_id": "16","genre": "家庭史诗","isbn": "9787208115279"},"17": {"title": "哈利波特与魔法石","author": "J.K. 罗琳","book_id": "17","genre": "奇幻","isbn": "9787020033430"},"18": {"title": "了不起的盖茨比","author": "弗朗西斯·斯科特·菲茨杰拉德","book_id": "18","genre": "美国小说","isbn": "9787532737974"},"19": {"title": "不可抗力","author": "玛丽安娜·海拉","book_id": "19","genre": "现代小说","isbn": "9787544291179"},"20": {"title": "我们仨","author": "杨绛","book_id": "20","genre": "回忆录","isbn": "9787530219214"},"21": {"title": "天才在左 疯子在右","author": "高铭","book_id": "21","genre": "心理学","isbn": "9787508657421"},"22": {"title": "我与地坛","author": "史铁生","book_id": "22","genre": "散文","isbn": "9787530216770"},"23": {"title": "地球往事","author": "刘慈欣","book_id": "23","genre": "科幻","isbn": "9787536692930"},"24": {"title": "平凡的世界","author": "路遥","book_id": "24","genre": "现实主义","isbn": "9787020016402"},"25": {"title": "无人生还","author": "阿加莎·克里斯蒂","book_id": "25","genre": "悬疑","isbn": "9787208060943"}
}

基本功能

  1. 登记书籍
    • 用户可以输入书籍的ID、ISBN、书名、作者和类型来登记一本新书。
    • 程序会验证书籍ID和ISBN的有效性,避免重复登记。
  2. 删除书籍
    • 通过输入书籍ID,用户可以删除已登记的书籍信息。
  3. 修改书籍
    • 用户可以输入书籍ID,然后修改书籍的ISBN、书名、作者或类型。
    • 只需输入需要修改的项,不修改的项可以直接按回车键跳过。

查询功能

  1. 显示所有书籍
    • 列出所有已登记的书籍信息,便于用户浏览。
  2. 按ID查找书籍
    • 通过输入书籍ID,用户可以查找并显示特定书籍的信息。
  3. 按书名查找书籍
    • 用户可以输入书名的一部分或全部,程序会查找并显示包含该书名的所有书籍信息。
  4. 按类型查找书籍
    • 通过输入书籍类型,用户可以查找并显示所有属于该类型的书籍。

其他功能

  1. 保存并退出程序
    • 程序会将所有书籍信息保存到名为 books.json 的文件中,并退出程序。
    • 如果没有书籍信息,将不会保存文件。

程序结构

  • BookManager 类负责所有书籍管理的核心功能,包括导入、导出书籍信息,登记、删除、修改和查找书籍。
  • main 函数提供一个简单的命令行菜单,用户可以通过选择不同的选项来执行相应的操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础之协程

文章目录 1 协程1.1 简介1.2 协程优势&分类1.2.1 优势1.2.2 分类 1.3 generator协程1.4 gevent协程1.5 asyncio1.5.1 简介1.5.2 asyncio函数1.5.3 async\await1.5.4 asyncio基本操作1.5.4.1 asyncio协程对象1.5.4.2 task对象1.5.4.3 future对象1.5.4.4 绑定回调1.5.4.5 异步…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日聚会(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 &#x1f…

使用antd的<Form/>组件获取富文本编辑器输入的数据

前端开发中,嵌入富文本编辑器时,可以通过富文本编辑器自身的事件处理函数将数据传输给后端。有时候,场景稍微复杂点,比如一个输入页面除了要保存富文本编辑器的内容到后端,可能还有一些其他输入组件获取到的数据也一并…

Mac搭建anaconda环境并安装深度学习库

1. 下载anaconda安装包 根据自己的操作系统不同,选择不同的安装包Anaconda3-2024.06-1-MacOSX-x86_64.pkg,我用的还是旧的intel所以下载这个,https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/,如果mac用的是M1&#xff0…

GuLi商城-商品服务-API-品牌管理-云存储开通与使用

这里学习下阿里云对象存储 地址:对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 登录支付宝账号,找到了我以前开通的阿里云对象存储 熟悉下API 文档中心 简介_对象存储(OSS)-阿里云帮助中心 我们将用这种方式上传阿里云OSS

SprongBoot3整合Knife4j实现在线接口文档

大家好,我是晓凡。 写在前面 在上一篇文章,我们详细介绍了SpringBoot3 怎么整合SpringDoc实现在线接口文档。但是,有不少小伙伴 都觉得接口界面太丑了。有没有什么更美观一点的UI界面呢? 当然是有的了,毕竟这是一个…

那些年,学过的屠龙术

朱泙漫学屠龙于支离益,单千金之家,三年技成而无所用其巧。 程序员的技能,比如: Windows平台编程,从入行业时至今,没有做过相关的业务,相关的知识只能当成谈资。 Windows平台下应用的crash问题&…

基于Android Studio电影购票系统

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 主要实为了方便用户随时随地进行电影购票。在配色方面选择了一些富有电影元素的颜色。主要能够实现的功能与流程为: 1.用户首先需要注册用户名填写密码。 2.用户可以用之前注册的用户名和密码进行登录。 3.登…

数据库——数据库性能优化

title: 数据库——数据库性能优化 date: 2024-07-06 12:26:21 tags: 数据库 categories: 数据库 cover: /image/T1.jpg description: 数据库——MySQL的性能优化 数据库优化 系统的吞吐量瓶颈往往出现在数据库的 访问速度 上,随着应用程序的运行,数据库…

【密码学】密码学体系

密码学体系是信息安全领域的基石,它主要分为两大类:对称密码体制和非对称密码体制。 一、对称密码体制(Symmetric Cryptography) 在对称密码体制中,加密和解密使用相同的密钥。这意味着发送方和接收方都必须事先拥有这…

kubeadm离线部署kubernetesv1.30.0

背景:最近由于docker image获取镜像受限的问题,以及公司内部部署kubernetes受限于内部网络无法访问公网的问题,对于离线部署kubernetes成为不是十分方便。谨以此文仅供参考。 kubernetes部署节点信息 kubernetes版本 1.30.0 操作系统版本&a…

springboot2.7.6 集成swagger

在 Spring Boot 2.7.6 版本中集成 Swagger 的步骤相对直接,主要涉及添加依赖、编写配置以及在控制器中添加文档注解几个环节。 下面是集成 Swagger 的基本步骤: 1. 添加依赖 首先,在pom.xml文件中添加 Swagger 相关依赖。 对于 Spring Boot…

1-3 NLP为什么这么难做

1-3 NLP为什么这么难做 主目录点这里 字词结构的复杂性 中文以汉字为基础单位,一个词通常由一个或多个汉字组成,而不像英语词汇单元由字母构成。这使得中文分词(切分句子为词语)成为一个具有挑战性的任务。语言歧义性 中文中常…

提升机硬件设备的技术规格文档

提升机硬件设备技术规格文档 1. 产品概述 本技术规格文档旨在详细描述[公司名称]生产的[型号]型提升机的硬件设备技术参数、性能指标、安全特性及安装维护要求。该提升机设计用于[具体应用场景,如高层建筑、仓库货物搬运、家用等],旨在提供高效、安全、…

网络安全设备——蜜罐

网络安全设备蜜罐(Honeypot)是一种主动防御技术,它通过模拟真实网络环境中的易受攻击的目标,以吸引和监测攻击者的活动。具体来说,蜜罐是一种虚拟或实体的计算机系统,它模拟了一个真实的网络系统或应用程序…

AcWing 3207:门禁系统 ← 桶排序中“桶”的思想

【题目来源】https://www.acwing.com/problem/content/3210/【题目描述】 涛涛最近要负责图书馆的管理工作,需要记录下每天读者的到访情况。 每位读者有一个唯一编号,每条记录用读者的编号来表示。 给出读者的来访记录,请问每一条记录中的读者…

C语言的结构体写法

C语言中的结构体是一种用户自定义的数据类型,它可以同时存储多个不同类型的数据。结构体由多个成员变量组成,每个成员变量可以有不同的数据类型。 结构体的定义形式为: struct 结构体名 {数据类型 成员变量1;数据类型 成员变量2;// 其他成员…

Shell编程类-网站检测

Shell编程类-网站检测 面试题参考答法 a(1 2 3 4) echo ${a[0]} echo ${a[*]}这里声明一个数值,并选择逐个调用输出还是全部输出 curl -w %{http_code} urL/IPADDR常用-w选项去判断网站的状态,因为不加选择访问到的网站可能出现乱码无法判断是否网站down…

Xilinx FPGA:vivado关于fifo的一些零碎知识

一、FIFO概念 先进先出,是一种组织和操作数据结构的方法。在硬件应用中,FIFO一般由一些读写指针,存储和控制的逻辑组成。 二、xilinx中生成的FIFO的存储类型 (1)shift register FIFO : 移位寄存器FIFO,这…

【基础篇】1.8 C语言基础(二)更新中

三,位操作 在STM32开发中,位操作是非常重要的技术,特别是在处理器外设寄存器的配置和控制过程中。它可以有效地提高代码的性能、可维护性和可移植性。 3.1 位操作运算符 3.1.1 按位与(&) 运算规则:如果两个操作数的对应位都为 1,则结果为 1;否则为 0。示例:a &…