【Python】简易书籍管理程序

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

import json
import re
import time

class 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_ISBN
            if new_title:
                self.books[book_id]['title'] = new_title
            if new_author:
                self.books[book_id]['author'] = new_author
            if new_genre:
                self.books[book_id]['genre'] = new_genre

            print("书籍信息已更新。")
        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 = False

        for book in self.books.values():
            # 检查输入的书名是否为书籍标题的一部分
            if title in book['title']:
                print(f"{book}")
                found = True

        if not found:
            print("没有找到该书名的书籍。")

    def find_book_by_genre(self):
        genre = input("输入书籍类型: ")
        found = False
        index = 1

        for book in self.books.values():
            # 检查输入的书名是否为书籍标题的一部分
            if genre in book['genre']:
                print(f"{index}{book}")
                index = index + 1
                found = True

        if 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 None


def 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.mfbz.cn/a/779076.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一维前缀和的实现

这是C算法基础-基础算法专栏的第十一篇文章,专栏详情请见此处。 引入 我们用朴素做法求一维数组的区间和时,一般是从前向后循环累加,它的时间复杂度为,当求区间和的次数过多,则会有超时的可能,那有没有时间…

web零碎知识2

不知道我的这个axios的包导进去没。 找一下关键词: http请求协议:就是进行交互式的格式 需要定义好 这个式一发一收短连接 而且没有记忆 这个分为三个部分 第一个式请求行,第二个就是请求头 第三个就是请求体 以get方式进行请求的失手请求…

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API

首先我们用IDEA新建一个项目,请将这些关键位置按照我的设置设置一下 接下来我将要带着你一步一步创建一个Get请求和Post请求,通过客户端请求的参数,以json格式返回该参数{“message”:"Hello"} 1,先在IDE左上角把这里改为文件模式…

3101.力扣每日一题7/6 Java(接近100%解法)

博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 主要是基于对…

connect to github中personal access token生成token方法

一、问题 执行git push时弹出以下提示框 二、解决方法 去github官网生成Token,步骤如下 选择要授予此 令牌token 的 范围 或 权限 要使用 token 从命令行访问仓库,请选择 repo 。 要使用 token 从命令行删除仓库,请选择 delete_repo 其他根…

06-6.4.4 拓扑排序

👋 Hi, I’m Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

搜索广告召回技术在美团的实践

内容整理自美团技术沙龙第81期《美团在广告算法领域的探索及实践》(B站视频)。本文首先介绍了美团搜索广告的三个阶段:多策略关键词挖掘、分层召回体系、生成式召回;然后重点介绍了生成式关键词召回、多模态生成式向量召回、生成式…

计算机网络之令牌总线

上文内容:什么是以太网 1.令牌总线工作原理 在总线的基础上,通过在网络结点之间有序地传递令牌来分配各结点对共享型总线的访问权利,形成闭合的逻辑环路。 完全采用半双工的操作方式,只有获得令牌的结点才能发送信息&#xff…

第1章 项目背景(学成在线),项目介绍,环境搭建

1.项目背景 1.1 在线教育市场环境 以下内容摘自https://report.iresearch.cn/content/2021/01/358854.shtml 在线教育行业是一个有着极强的广度和深度的行业,从校内到校外;从早幼教到职业培训;从教育工具到全信息化平台等等。 2020年的新…

NVIDIA RTX Remix开源 让AI驱动的经典游戏重制复兴

游戏开发商往往会让激动的粉丝们在游戏发布后等待数年,以获得他们喜爱的游戏的重制版。不过,这个问题可能很快就会成为过去。NVIDIA 宣布其 RTX Remix 工具包将开放源代码,这将为钟情于经典游戏的玩家带来惊喜。 RTX Remix 是 NVIDIA 的修改套…

Android面试题自定义View之Window、ViewRootImpl和View的三大流程

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 View的三大流程指的是measure(测量)、layout(布局)、draw(绘制)。 下面我们来分别看看这三大流程 View的measure(测量) MeasureSpec Measur…

React 省市查询组件完整代码

目录 一、地区文件 二、Antd配合使用 三、实现效果 一、地区文件 下载地址:全国省市区数据_JSON格式_SQL格式 export const chinaArea {0: {1: 北京,2: 天津,3: 河北省,4: 山西省,5: 内蒙古自治区,6: 辽宁省,7: 吉林省,8: 黑龙江省,9: 上海,10: 江苏省,11: 浙…

Linux之进程控制(下)

目录 进程替换的概念 进程替换的函数 execl​编辑 execlp execle execv execvp execve 上期,我们学习了进程创建,进程终止和进程等待,今天我们要学习的是进程控制中相对重要的板块------进程替换。 进程替换的概念 在进程创建时&…

微米级触觉感知的紧凑视触觉机器人皮肤

视触觉皮肤(VTS)分为涂层型、标记型和热致变色型。涂层的耐磨性和空间分辨率是涂层型VTS的核心问题。近期,北京邮电大学方斌教授联合中国地质大学(北京)杨义勇教授,在传感器领域Q1期刊IEEE Sensors Journal…

DHCP服务器

目录 网络传输原则: DHCP: DHCP作用: 优缺点: DHCP的原理: 用虚拟机模拟DHCP服务器​编辑​编辑 网络传输原则: 网络是双向的,网络是有方向的 解释:网络是双向的: …

轻松快速上手Thekey库,实现数据加密无忧

Thekey的概述: Thekey库是一个Python库,旨在简化数据加密、解密、签名和验证的过程。它提供了一套简洁易用的接口,用于处理各种加密任务,适合需要在应用程序中实现安全数据处理的开发人员. 安装Thekey库 pip install thekey使用Thekey库进行基本加密和解密操作的…

uniapp 在手机上导出excel

1.创建excelDev.js文件 export default {exportExcel(fileData, documentName excel) {plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {let rootObj fs.rootlet fullPath rootObj.fullPathconsole.log("开始导出数据")// 创建文件夹rootObj…

Linux进程(1)(结构-操作系统-进程)

目录 1.体系结构 2.操作系统(Operator System) 1)概念: 2)结构 示意图(不完整) 3)尝试理解操作系统 4)系统调用和库函数概念 3.认识进程 1.启动 2.进程创建的代码…

11.x86游戏实战-汇编指令add sub inc dec

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 上一个内容:10.x86游戏实战-汇编指令lea 首先双击下图红框位置 然后在下图红框位置输入0 然…

Lock4j简单的支持不同方案的高性能分布式锁实现及源码解析

文章目录 1.Lock4j是什么?1.1简介1.2项目地址1.3 我之前手写的分布式锁和限流的实现 2.特性3.如何使用3.1引入相关依赖3.2 配置redis或zookeeper3.3 使用方式3.3.1 注解式自动式3.3.2 手动式 4.源码解析4.1项目目录4.2实现思路 5.总结 1.Lock4j是什么? 1.1简介 lock4j是苞米…