python编写图书管理系统
作者:Brisa56 发布时间:2022-04-12 11:07:21
本文实例为大家分享了python实现图书管理系统的具体代码,供大家参考,具体内容如下
题目:写一个简单的图书借阅系统
学校二手书是个大市场,A老师决定涉足这个领域,她需要写一个图书管理系统帮她管理书籍的借阅情况,她希望这个程序可以做到:
1. 查询书籍:可以一键查询系统里所有书籍的信息和借阅情况
2. 添加书籍:往系统添加书籍时,需要输入书籍的基本信息(书名,作者,推荐理由)
3. 借阅书籍:当书籍的状态是“未借出”的时候,书籍才可以借,借出以后的书籍状态为“已借出”
4. 归还书籍:归还成功后书籍的状态会更改成“未借出”,下一个同学可以再借了。
既然已经学习了类和对象,所以不用考虑其他编程模式。
类的两种用法:1. 类作为实例对象的模板 2. 类作为函数包。第一种用法是使用类生成实例对象。类作为实例对象的模版,每个实例创建后,都将拥有类的所有属性和方法。第二种用法是用类将多个函数(方法)打包封装在一起,让类中的方法相互配合。
该项目中,处理的对象是每本具体的书籍,每本书都有自己的属性信息,由此,可以定义一个Book类,利用Book类创建一个个书的实例,绑定属性(第一种用法)
而对于而这个管理系统的运行主体,是多个可供选择的功能的叠加,所以我们可以创建一个系统运行类BookManager,将查询书籍、添加书籍等功能封装成类中的方法以供调用(第二种用法)
课堂上,我们已编写了基本功能,见附件1BookRent.py
------------------------------------------
对程序进行改造升级:
1. 图书信息从CSV文件获取(附件2),注意在借阅和归还时修改图书的状态
2. 考虑对书籍进行分类:继承Book类,创建一些子类,例如,FictionBook,改造其初始化方法,增加参数type=‘玄幻类’
3. 实现模糊查询:例如,让用户输入作者名,就能打印出系统里该作者所有书籍的相关信息;输入玄幻类,打印出所有这类书籍的相关信息
CSV表格部分如下:
代码:
# coding = utf-8
import csv
from itertools import islice
import pandas as pd
import os
class Book:
def __init__(self, name, author, recommendation, type, status=0): # 对实例属性进行初始化
self.name = name
self.author = author
self.recommendation = recommendation
self.status = status
self.type = type
def __str__(self):
if self.status == 1:
status = '已借出'
else:
status = '未借出'
return '名称:《%s》作者:%s 推荐语:%s 类别: %s 状态:%s ' % (self.name, self.author, self.recommendation, self.type, status)
class FictionBook(Book):
def __init__(self, type='奇幻'):
self.type = type
class NovelBook(Book):
def __init__(self, type='小说'):
self.type = type
class JottingsBook(Book):
def __init__(self, type='随笔'):
self.type = type
class BookManager:
books = []
def __init__(self):
f = open('BookInfos.csv', 'r')
readers = csv.reader(f)
for row in islice(readers, 1, None):
self.books.append(Book(row[0], row[1], row[2], row[3], row[4]))
f.close()
def menu(self): # 显示选择菜单,根据不同菜单的选项调用不同的方法
print('欢迎使用大数据团队图书节约系统,每本书都是好书,希望钟老师的市场越来越好。\n')
while True:
print(' 1.查询书籍\n 2.添加书籍\n 3.借阅书籍\n 4.归还书籍\n 5.退出系统\n')
choice = int(input('请输入数字选项对应的功能,例如:1(指....)'))
if choice == 1:
self.show_all_book()
elif choice == 2:
self.add_book()
elif choice == 3:
self.lend_book()
elif choice == 4:
self.return_book()
elif choice == 5:
print('感谢使用!欢迎下次再来!')
break
def show_all_book(self): # 显示书籍信息
print("1.查询作者相关书籍\n2.查询类别相关书籍\n3.查询所有书籍")
ch = eval(input('请输入你的选择:例如:1(指....)'))
if ch == 1:
author = input("请输入作者名字:")
for book in self.books:
if book.author == author:
print('')
print(book)
elif ch == 2:
type = input("请输入书籍类别:")
for book in self.books:
if book.type == type:
print('')
print(book)
elif ch == 3:
for book in self.books:
print('')
print(book)
else:
print("您的输入有误噢!")
def add_book(self): # 添加书籍
new_name = input('请输入书籍的名字:')
new_author = input('请输入书籍的作者:')
new_comment = input('请输入书籍的推荐语:')
new_type = input('请输入书籍的类别:')
new_book = [new_name, new_author, new_comment, new_type, 0]
# 写入CSV文件
f = open('BookInfos.csv', 'a+')
writer = csv.writer(f)
writer.writerow(new_book)
f.close()
# 改变books[]
self.books.append(Book(new_book[0], new_book[1], new_book[2], new_book[3], new_book[4]))
print('书籍录入成功!\n')
def check_book(self, name): # 检查是否存在该书籍
for book in self.books:
if book.name == name:
return book
else:
return -1
def lend_book(self): # 借阅书籍
name = input('请输入你想借阅的书籍名字:')
res = self.check_book(name)
if res != -1:
if res.status == 1:
print('你来晚了,这本书已经被借走了')
else:
print('借阅成功!借了不看会变胖~~~')
res.status = 1
manager.change_status(name)
else:
print('这本书暂时没有在系统里!')
def return_book(self): # 归还书籍
name = input('请输入归还书籍的名字:')
res = self.check_book(name)
if res == -1:
print('没有这本书,你恐怕输错书名了~')
else:
if res.status == 0:
print('这本书没有被借走!')
else:
print('归还成功')
res.status = 0
manager.change_status(name)
# 这里我做实验时有些些问题,去掉manager.会出现 name is not defined 学艺不精,还不够了解python,见谅
@staticmethod
def change_status(name): # 修改CSV文件中借还书籍的状态
in_file = open("BookInfos.csv", "r")
reader = csv.reader(in_file)
out_file = open("BookInfos1.csv", "w", newline='')
writer = csv.writer(out_file)
for row in reader:
if row[0] == name:
if row[4] == '0':
row[4] = '1'
else:
row[4] = '0'
writer.writerow(row)
in_file.close()
out_file.close()
os.remove("BookInfos.csv") # 删除原文件
os.rename("BookInfos1.csv", "BookInfos.csv") # 重命名写入文件,此法不可取,但是我暂时找不到好的方法了
print("已修改CSV文件")
# 这里我做实验时也有些些问题。1.不会修改特定单元格,2.选择了修改后替换原文件的方法,此法若真实用于大型文件管理,会导致效率大幅度降低,不可取,见谅
manager = BookManager()
manager.menu()
此次实验前前后后断断续续做了5天左右,主要还是对python的CSV模块不太熟悉,建议大家好好学习。
来源:https://blog.csdn.net/m0_43416592/article/details/105620877
猜你喜欢
- 语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷。我们经常会这么写function ca
- 1. 引言热力图,是一种通过对色块着色来显示数据的统计图表。绘图时,需指定颜色映射的规则。例如,较大的值由较深的颜色表示,较小的值由较浅的颜
- 本文实例讲述了laravel框架中路由设置,路由参数和路由命名。分享给大家供大家参考,具体如下:laravel中必须先配置路由,才能使用。不
- 下面先看下js禁止右击保存图片。禁止鼠标右键保存图片<img src="" oncontextmenu="
- Python自动化办公之删除重复文件思路介绍两层判断:1.先判断文件大小是否为相同,大小不同则不是重复文件,予以保留;2.文件大小相同再判断
- logging是python语言中的一个日志模块,专门用来写日志的,日志级别通常分为debug、info、warning、error、cri
- PHP getName() 函数实例返回 XML 元素及其子元素的名称:<?php $xml=<<<XML<?
- 需求是小程序做头部做导航分类的效果顶部用 scroll-view 组件横向滚动,类似tab选项卡的效果,内容用类似模板方式引用,可重复利用&
- 首先说一下我遇到的坑,生产上遇到的问题,我调度Python脚本执行并监控这个进程,python脚本运行时间远远大于python脚本中自己统计
- 问题1:使用.net2005自带的SQL-Express连接不上。解决方法:1.网络防火墙阻止数据库连接;2.默认SQL-Express没有
- 本文实例讲述了JavaScript设计模式之模板方法模式原理与用法。分享给大家供大家参考,具体如下:一、模板方法模式:一种只需使用继承就可以
- 这篇文章主要介绍了Python list运算操作代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需
- 第一种方法: /* 创建链接服务器 */ exec sp_addlinkedserver 'srv_lnk','
- 本文实例讲述了JS实现判断有效的数独算法。分享给大家供大家参考,具体如下:判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入
- 1、弹出菜单也叫上下文菜单,建立菜单并向菜单添加各种功能。2、右键监听鼠标。如右键点击,则根据位置判断弹出。3、调用Menupop方法。4、
- 有的时候,我们为了保持网页的美观,需要将较长的文字在一定长度时截断。比如我们希望在列表中显示文章标题的前15个字,那么一个这样的标题:“rs
- 在使用echarts的自定义饼图Customized Pie时,定义的动态数据会发生颜色无法渲染的问题,如下图所示:该图表的颜色是根据ite
- 1、块级作用域想想此时运行下面的程序会有输出吗?执行会成功吗?#块级作用域if 1 == 1: name = "lzl"
- 但凡介绍数据库连接池的文章,都会说“数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理
- conftest.py文件特点所有同目录测试文件运行前都会执行conftest.py文件 不需要import导入conftest.py,py