python实现图书管理系统(课设)

2023-11-09

图书管理系统图书管理系统

某图书馆所藏图书如表1所示:

书号

书名

出版社

作者

价格

库存

10001

C语言程序设计

清华大学出版社

张三

51

5

10002

Python程序设计基础

高等教育出版社

李四

45

6

借阅信息如表2所示:

学号

书号

借阅日期

1001

10001

20190309

1002

10002

20190401

学生信息如表3所示

学号

姓名

性别

班级

1001

张三

化学1801

1002

李四

化学1802

主要实现以下功能:

(1)能分别输入表1和表3的信息,并将其分别保存到两个文件

(2)从分别从文件中读出图书信息和学生信息

(3)实现借阅功能:输入学号和书号,如果借阅成功(学号所对应的学生在表3中并且书号所对应的图书在表1中且库存大于等于1),修改表1和表2,并保存到文件

(4)实现还书功能:从表2中删除该学生的借阅信息,并修改表1的库存信息,并保存到文件

(5)输入某学生姓名,可以查询该生的借阅图书信息

(6)输入某书号,可以查询借阅该书的学生信息

(7)统计某出版社的藏书量,统计某学生当前借书量

(8)利用第三方库matplotlib中的pyplot绘制统计图,如绘制各出版社的藏书量折线图

import time

import pandas as pd
import os
import matplotlib.pyplot as plt

# 先定义一个配置类
from Tools.scripts.treesync import raw_input


class Config:
    # 定义表一
    table1_url = "C:\\Users\\Shinelon\\Desktop\\untitled\\resource\\table1.csv"
    table1_header = ["书号", "书名", "出版社", "作者", "价格", "库存"]
    # 定义表二
    table2_url = "C:\\Users\\Shinelon\\Desktop\\untitled\\resource\\table2.csv"
    table2_header = ["学号", "书号", "借阅日期"]
    # 定义表三
    table3_url = "C:\\Users\\Shinelon\\Desktop\\untitled\\resource\\table3.csv"
    table3_header = ["学号", "姓名", "性别", "班级"]


class library_system(object):
    def __init__(self):
        print("图书馆系统初始化中...")
        self.input_table1_table2()
        self.book_table, self.borrow_table, self.student_table = self.get_info_from_file()
        print("图书馆系统初始化完成!")
        self.menu()

    def input_table1_table2(self):
        print("请输入图书馆藏书表")
        table1 = []
        print("输入藏书表:书号 书名 出版社 作者 价格 库存\n")
        x = raw_input('请输入数据:')
        while x != "exit\n":
            y = x.split()
            if len(y) != 6:
                x = raw_input('列数不一致\n请重新输入:')
            else:
                table1.append(y)
                x = raw_input('下一条记录:')
        print("请输入学生信息表")
        table3 = []
        print("输入学生表:学号 姓名 性别 班级\n")
        x = raw_input('请输入数据:')
        while x != "exit\n":
            y = x.split()
            if len(y) != 4:
                x = raw_input('数据列数不一致\n请重新输入:')
            else:
                table3.append(y)
                x = raw_input('下一条记录:')
        table1 = pd.DataFrame(table1)
        table3 = pd.DataFrame(table3)
        table1.to_csv(Config.table1_url, header=Config.table1_header, index=None)
        table3.to_csv(Config.table3_url, header=Config.table3_header, index=None)

    def get_info_from_file(self):
        book_table = pd.read_csv(Config.table1_url)
        borrow_table = []
        student_table = pd.read_csv(Config.table3_url)
        print("信息读取成功...")
        return book_table, borrow_table, student_table

    def save_file(self):
        self.book_table.to_csv(Config.table1_url, header=Config.table1_header, index=None)
        boo = pd.DataFrame(self.borrow_table)
        boo.to_csv(Config.table2_url, header=Config.table2_header, index=None)
        self.student_table.to_csv(Config.table3_url, header=Config.table3_header, index=None)
        print("保存文件成功")

    # 实现借阅功能:输入学号和书号,如果借阅成功(学号所对应的学生在表3中并且书号所对应的图书在表1中且库存大于等于1),修改表1和表2,并保存到文件
    def borrow(self, student_id, book_id):
        flag1=True
        for i in range(len(self.student_table["学号"])):
            if int(self.student_table["学号"][i])==int(student_id):
                print("查询到该学生")
                flag1=False
                for j in range(len(self.book_table["书号"])):
                    if int(self.book_table["书号"][j])==int(book_id) and int(self.book_table["库存"][j])>0:
                        print("库存充足")
                        self.book_table["库存"][j] = str(int(self.book_table["库存"][j])-1)
                        borrow = [student_id,book_id, time.strftime("%d/%m/%Y")]
                        self.borrow_table .append(borrow)
                        self.save_file()
                        break
            if not flag1:
                break
        if flag1:
            print("未查询到该学生")
        print("借阅图书")

    # 实现还书功能:从表2中删除该学生的借阅信息,并修改表1的库存信息,并保存到文件
    def let_back(self, student_id, book_id):
        for j in range(len(self.book_table["书号"])):
            if int(self.book_table["书号"][j])==int(book_id):
                self.book_table["库存"][j] = str(int(self.book_table["库存"][j])+1)
                for i in range(len(self.borrow_table)):
                    if int(self.borrow_table[i][0])==int(student_id) and int(self.borrow_table[i][1])==int(book_id):
                        del self.borrow_table[i]
                        self.save_file()
                        break
                break

        print("还书")

    # 输入某书号,可以查询借阅该书的学生信息
    def find_by_book_id(self, book_id):
        stu_ids=set()
        #先获取对应人的学号
        for i in range(len(self.borrow_table)):
            if int(self.borrow_table[i][1])==int(book_id):
                stu_ids.add(int(self.borrow_table[i][0]))
        stu=[]
        for i in range(len(self.student_table["学号"])):
            if int(self.student_table["学号"][i]) in stu_ids:
                stu.append(self.student_table.iloc[i])
        print("查询借了某本书的学生信息")
        print(stu)

    def sum_by_student_id(self, student_id):
        sum=0
        for i in range(len(self.borrow_table)):
            if int(self.borrow_table[i][0])==int(student_id):
                sum+=1
        print("统计某学生当前借书量"+str(sum))

    # 统计某出版社的藏书量,统计某学生当前借书量
    def sum_by_publish(self, publish_name):
        book_id = set()
        sum=0
        for i in range(len(self.book_table["出版社"])):
            if  str(self.book_table["出版社"][i])==str(publish_name):
                book_id.add(int(self.book_table["出版社"][0]))
                sum+=int(self.book_table["库存"][i])
        for i in range(len(self.borrow_table)):
            if self.borrow_table[i][1] in book_id:
                sum+=1
        print(str(publish_name)+"统计藏书量"+str(sum))
        return sum

    # 输入某学生姓名,可以查询该生的借阅图书信息
    def find_by_student_name(self, student_name):
        stu_id=set()
        for i in range(len(self.student_table["姓名"])):
            if str(self.student_table["姓名"][i])==str(student_name):
                stu_id.add(int(self.student_table["学号"][i]))
                print("找到")
        book_id=set()
        res=[]
        for i in range(len(self.borrow_table)):
            if int(self.borrow_table[i][0]) in stu_id:
                book_id.add(int(self.borrow_table[i][1]))
        for i in range(len(self.book_table["书号"])):
            if int(self.book_table["书号"][i]) in book_id:
                res.append(self.book_table.iloc[i])
        print("查询某学生的借书信息")
        print(res)
    #获取各出版社的藏书量折线图
    def get_publish(self):
        pub = set()
        for i in range(len(self.book_table["出版社"])):
            pub.add(str(self.book_table["出版社"][i]))
        pubL = list(pub)
        x1 = range(len(pubL))
        numL = []
        for i in range(len(pubL)):
            numL.append(self.sum_by_publish(pubL[i]))
        plt.title('各出版社的藏书量折线图')
        plt.xlabel('出版社名字')
        plt.ylabel('藏书量')
        plt.plot(pubL, numL, 'r', label='藏书量')
        plt.xticks(x1, pubL, rotation=0)
        plt.legend()
        plt.grid()
        plt.show()
        # 利用第三方库matplotlib中的pyplot绘制统计图,如绘制各出版社的藏书量折线图,绘制各学生借书量的饼图等

    def get_stu(self):
        stu_id = set()
        for i in range(len(self.student_table["学号"])):
            stu_id.add(int(self.student_table["学号"][i]))
        stuL = list(stu_id)
        numL = []
        for i in range(len(stuL)):
            numL.append(self.sum_by_student_id(stuL[i]))

        plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
        plt.figure(figsize=(6, 6))  # 将画布设定为正方形,则绘制的饼图是正圆
        plt.pie(numL,  labels=stuL, autopct='%1.1f%%')  # 绘制饼图
        plt.title('2018年饼图')  # 绘制标题
        plt.show()
    # 1绘制各出版社的藏书量折线图,2绘制各学生借书量的饼图
    def show_diaglo(self,chos):
        if str(chos)=="1":
            self.get_publish()
        if str(chos)=='2':
            self.get_stu()
        print("展现图表")

    def cls(self):
        os.system("cls")

    def menu(self):
        level_1_choose = raw_input("按回车继续")
        while level_1_choose != "exit\n":
            self.cls()
            print("图书管理系统菜单\n")
            print("1 借阅功能 请输入: 1 学号 书号")
            print("2 还书功能 请输入: 2 学号 书号")
            print("3 查询学生借阅信息 请输入: 3 学生姓名")
            print("4 查询借该书的学生信息 请输入: 4 书号")
            print("5 统计某出版社的藏书量 请输入: 5 出版社名")
            print("6 统计某学生当前的借书量 请输入: 6 学生学号")
            print("7 绘图功能 请输入:7")
            level_1_choose = raw_input("请选择1-7你要选择的功能,输入exit退出")
            turn = True
            while turn:
                sp = level_1_choose.split()
                # 1-7
                if sp[0] == "1":
                    if len(sp) == 3:
                        self.borrow(sp[1], sp[2])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "2":
                    if len(sp) == 3:
                        self.let_back(sp[1], sp[2])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "3":
                    if len(sp) == 2:
                        self.find_by_student_name(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "4":
                    if len(sp) == 2:
                        self.find_by_book_id(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "5":
                    if len(sp) == 2:
                        self.sum_by_publish(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "6":
                    if len(sp) == 2:
                        self.sum_by_student_id(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                elif sp[0] == "7":
                    if len(sp) == 2:
                        self.show_diaglo(sp[1])
                        turn = False
                    else:
                        turn = True
                        level_1_choose = raw_input("输入错误,请重新输入\n")
                else:
                    turn = True
                    level_1_choose = raw_input("输入错误,请重新输入\n")


if __name__ == '__main__':
    ls = library_system()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python实现图书管理系统(课设) 的相关文章

  • 如何查看Databricks中的所有数据库和表

    我想列出 Azure Databricks 中每个数据库中的所有表 所以我希望输出看起来像这样 Database Table name Database1 Table 1 Database1 Table 2 Database1 Table
  • 通过 Scrapy 抓取 Google Analytics

    我一直在尝试使用 Scrapy 从 Google Analytics 获取一些数据 尽管我是一个完全的 Python 新手 但我已经取得了一些进展 我现在可以通过 Scrapy 登录 Google Analytics 但我需要发出 AJAX
  • Python 的键盘中断不会中止 Rust 函数 (PyO3)

    我有一个使用 PyO3 用 Rust 编写的 Python 库 它涉及一些昂贵的计算 单个函数调用最多需要 10 分钟 从 Python 调用时如何中止执行 Ctrl C 好像只有执行结束后才会处理 所以本质上没什么用 最小可重现示例 Ca
  • 使 django 服务器可以在 LAN 中访问

    我已经安装了Django服务器 可以如下访问 http localhost 8000 get sms http 127 0 0 1 8000 get sms 假设我的IP是x x x x 当我这样做时 从同一网络下的另一台电脑 my ip
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • python 相当于 R 中的 get() (= 使用字符串检索符号的值)

    在 R 中 get s 函数检索名称存储在字符变量 向量 中的符号的值s e g X lt 10 r lt XVI s lt substr r 1 1 X get s 10 取罗马数字的第一个符号r并将其转换为其等效整数 尽管花了一些时间翻
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip

随机推荐

  • 关于SAR的研究热点——几点思考

    关于SAR的研究热点 几点思考 SAR研究热点之一 新体制论证 SAR系统设计追求的目标 图像质量高 空间和辐射分辨率高 成像幅宽大 具备多模式 扫描 可变入射角条带 斜视 聚束 多波段 全极化 三维成像 动目标检测与成像能力 对平台运动姿
  • 今日头条自媒体矩阵运营攻略

    你今天通常做什么 许多人用它来娱乐八卦 寻找乐趣 并打发时间 但对于媒体和品牌来说 它是一个非常好的操作平台 基于媒体矩阵标题数量的改进及其独特的推荐机制 公司传播品牌 打造个人品牌非常友好 今天我们讨论了标题号如何快速建立个人品牌的综合潜
  • Hexo一些实用的插件

    Hexo的插件真是个好东西 一开始部署博客的时候并没有太在意插件的问题 毕竟觉得博客主题自带的插件挺全面的 足够使用了 但是用久了总是会腻 就想着静态博客能不能整一些新操作 即使只是添加点小功能 于是就翻了翻 Hexo 的插件目录 挑了些比
  • Android BLE学习笔记

    http blog csdn net xiaoyaoyou1212 article details 51854454 个人网站 http www xiaoyaoyou1212 com 欢迎吐槽围观 前言 本文主要描述Android BLE的
  • 链式基数排序(第十章 P286 算法10.15,10.16,10.17)

    链式基数排序 概述 基数排序 radix sort 属于 分配式排序 distribution sort 基数排序也叫做多关键字排序 基数排序是一种借助 多关键字排序 的思想来实现 单关键字排序 的内部排序算法 多关键字排序的方法 n 个记
  • fastjson 重复引用和循环引用问题

    数据传输使用json格式再方便不过了 fastjson 由阿里巴巴那伙人使用Java语言编写 号称最快的JSON库前两天遇到一个问题 后台的数据转化为json字符串后发送到前台出现了 ref字样的东西 后来明白了这是引用 在传输的数据中出现
  • 【LKM】makefile的支持c99的方法: ccflags-y := -std=c99

    如果写的C代码中 变量的定义在 函数之后 则会warning warning ISO C90 forbids mixed declarations and code Wdeclaration after statement 解决办法 1 正
  • 子关卡卸载actor不完全的问题解决。

    在子关卡中 actorA里面挂接n个actor 结果卸载actorA时 挂接的那些actor没有随之卸载掉 解决办法也简单 给这些actor设置owner为actorA即可 即在actorA所在的类里 生成这些挂载的actor时 FActo
  • linux在欢迎界面restart,[Linux]如何手动触发kernel restart

    所谓Linux panic就是碰到错误情况时 code里主动调的一个函数panic 里面出不来 会让cpu重启 不允许再乱执行代码 以便保留现场 像下面这个例子 就是在kernel fault函数里检查到非法无效地址访问后的错误处理 主动调
  • MySQL的服务层和存储引擎层

    1 服务层 Server Layer 服务层是MySQL的顶层组件 负责处理客户端与MySQL服务器之间的交互 它提供了一组API和协议 使应用程序能够连接到MySQL服务器 并发送查询 事务管理 用户权限控制等请求 服务层负责解析和优化查
  • 区块链技术关键词

    区块链技术 区块链是一种分布式账本技术 通过将数据以区块的形式依次链接在一起 并使用密码学技术保证安全性和一致性 加密货币 加密货币是基于区块链技术的数字资产 例如比特币 Bitcoin 和以太坊 Ethereum 等 它们使用区块链来记录
  • neo4j入门(三) 在数据库已知存在的节点上创建新的边

    from py2neo import Graph Node Relationship from py2neo import NodeSelector graph Graph http localhost 7474 username neo4
  • POJ1753 FlipGame

    分类 状压 暴力枚举 参考博客 https www cnblogs com honeycat p 5176211 html 代码是这位博主原创的 加了点注释 题目 http poj org problem id 1753 1 用16位的in
  • 解决由于找不到xxx.dll,无法继续执行代码的问题

    在用vs写项目 或者你下载github上的C 代码的时候 是不是经常遇到由于找不到xxx dll 无法继续执行代码的问题 其实很简单 解决方法如下 首先 对应于不同的运行模式 debug和release 方法都是一样的 找到你项目目录下 项
  • ctfhub-web-密码口令

    弱口令 先尝试admin password 尝试admin admin 默认口令 一般这种题目都是要去找这个产品的默认密码
  • “卷”资金抢人才,一文看懂国产AI大模型竞争格局|钛度图闻

    神仙打架 大佬 下凡 编辑 刘亚宁 孙骋 作图 初彦墨 策划制作 钛媒体视觉中心 6月29日 美团在港交所发布公告 宣布收购王慧文创办的大模型公司 光年之外 这也给AI大模型市场留下了猜测 不只在国内 ChatGPT的访问量在近期增速下滑
  • QCC300x笔记(2) -- QCC3007芯片入门进阶(二)

    哈喽大家好 这是该系列博文的第二篇 篇 lt lt 系列博文索引 快速通道 gt gt 接着上一篇 这一篇主要讲解如何使用ADK Configuration Tool修改固件的常用配置一 在线模式 Go Configurable Read
  • 用Nginx+Redis实现session共享的均衡负载

    原文地址 https segmentfault com a 1190000004708640 前言 大学三年多 也做个几个网站和APP后端 老是被人问到 如果用户多了服务器会不会挂 总是很尴尬的回答 哈哈 我们的用户还少 到了服务器撑不住的
  • 一条链接获取你的照片【附源码】

    测试链接 https sunpma com other xiangjiquanxian 无论是手机还是pc 都会被获取 请谨慎点击 直接申请获取相机权限 拍照上传到服务器 现在众多手机APP乱用权限并窃取用户隐私 大家要注意保护好自己 代码
  • python实现图书管理系统(课设)

    图书管理系统图书管理系统 某图书馆所藏图书如表1所示 书号 书名 出版社 作者 价格 库存 10001 C语言程序设计 清华大学出版社 张三 51 5 10002 Python程序设计基础 高等教育出版社 李四 45 6 借阅信息如表2所示