python实现图书管理系统总结_python实现图书管理系统

#!/usr/local/bin/python3.7

#用户注册

deflogon():print("欢迎来到图书管理系统注册页面~")

username= input("请输入用户名:")if len(username)<6:print("用户名不能小于6个字符")else:

email= input("请输入邮箱:")

password= input("请输入密码:")if len(password)<8:print("密码不能少于8位")else:

rpassword= input("请确认密码:")if password ==rpassword:print("注册成功!")#函数调用,每追加一列数据都进行换行 每个数据之间都有空格

preserve_data(path,[username,' '+ email,' '+ password + '\n'])

login_tips= input('是否登录?(yes/no)')if login_tips =='yes':

login()else:pass

returnTrueelse:print("两次输入的密码不一致,请重新输入!")#递归调用

logon()#保存数据到文件

path = r'/Users/mozili/PYTHONWORKSPACE/bookManage/user.txt'

defpreserve_data(file_path,data):#将字符串转换为bytes,因为write写入的是字节流,不能是字符串 当为w时需要解码

#data = data.encode()

#打开文件,追加数据到文件

with open(file_path,'a') as wstream:#判断是否可写

ifwstream.writable():

wstream.writelines(data)else:print("没有权限!")#用户登录

deflogin():print("欢迎来到图书管理系统登录页面~")

tips= input("是否已经注册?(yes/no)")if tips =='yes':whileTrue:

username= input("输入用户名:")

password= input("输入密码:")#读取文件时可能会出现找不到文件的异常,因此使用try except

try:#读取文件中的内容

with open(path, 'rb') as stream:#读取多行保存到列表中,列表中保存的是二进制,字节

result =stream.readlines()#print(result)

#列表推导式,循环遍历列表,将字节解码为字符串放在一个新列表uesr_list

uesr_list = [i.decode() for i inresult]#print(uesr_list)

#循环遍历列表,检查输入的用户名和密码是否在字符串中

for i inuesr_list:

info= i.split(' ')#print(info)

if username == info[0] and password == info[2].rstrip('\r\n'):print("登录成功")

operate(book_path,username)break

else:raise Exception("用户名或密码错误,请重新输入!")exceptException as err:print(err)#没有异常时执行else语句

else:break

else:print("您还未注册,请先注册后再登录!")#递归

logon()#查询图书

deffind_books(path):try:

with open(path,'r') as rstream:#readlines读到的内容是一个列表

container =rstream.readlines()#通过列表推导式得到新的列表,即每个元素去掉后面的换行符号

new_container = [books_name.rstrip('\n') for books_name incontainer]for b_name innew_container:#打印图书+《》

print("《{}》".format(b_name))exceptException as err:print("错误原因:",err)#添加图书

defadd_book(b_path,username):#添加前首先判断是否是管理员

permission(b_path, username)#追加图书 不能是w ,否则会清空之前的内容

with open(b_path, 'a') as wstream:#判断是否可写

ifwstream.writable:

msg= input("请输入书名:")try:#添加书籍之前判断某本书是否已经添加

with open(b_path) as rstream:whileTrue:

line=rstream.readline()#去掉右边的换行

line = line.rstrip('\n')#当找到空行是如果还没有找到与输入的书名一致的时候,就添加输入的书名

if notline:

book= '\n' +msg

wstream.write(book)print("添加成功")break

else:#输入的图书和读到的行有一致的则提示不能重复添加

if line ==msg:print("{}已添加,请不要重复添加哦~".format(msg))break

exceptException as err:print("错误原因:", err)else:print("没有权限")#修改图书

defupdate_book(b_path,username):

permission(b_path, username)try:

with open(b_path,'r') as rstream:

container=rstream.read()#通过'\n'来分割字符串,返回结果是列表

container = container.split('\n')#print(container)

#删除前先展示有哪些图书

find_books(book_path)

book_name= input("请输入需要修改的图书书名:")#循环遍历修改书名

for i inrange(len(container)):if book_name ==container[i]:

rbook_name= input("请输入修改后的图书书名:")

container[i]= rbook_name + '\n'

else:#列表中的每个书名后面加换行符,用于写入文件时换行

container[i] = container[i] + '\n'

#print(container)

#将书名更新后的内容以writelines写入文件中 writelines(可迭代)

with open(b_path, 'w') as wwstream:

wwstream.writelines(container)print("修改成功")exceptException as err:print("错误原因:", err)#删除图书

defdel_book(b_path,username):

permission(path, username)try:

with open(b_path,'r') as rstream:

container=rstream.read()#通过'\n'来分割字符串,返回结果是列表

container = container.split('\n')#print(container)

#展示有哪些图书

find_books(book_path)

book_name= input("请输入需要删除的图书书名:")#循环遍历修改书名

for i in range(len(container) - 1):if book_name ==container[i]:

container.remove(container[i])else:#列表中的每个书名后面加换行符,用于写入文件时换行

container[i] = container[i] + '\n'

#print(container)

#将书名删除后的内容以writelines写入文件中 writelines(可迭代)

with open(b_path, 'w') as wwstream:

wwstream.writelines(container)print("删除成功")exceptException as err:print("错误原因:", err)#借书

defborrow_book(username):whileTrue:print("图书列表:")

find_books(book_path)

borrow_books= input("请选择图书:")try:

with open('../user_books/user_books.txt') as rstream:#每次读取一行

lines =rstream.readline()

lines= lines.rstrip('\n')#将读到的内容通过空格分割保存到列表

lines = lines.split(' ')#判断输入的书是否已被借走

if borrow_books not inlines:#print(lines)

#借书之前先判断该用户之前是否借过,如果借过,就在后面累加图书,用,分割图书

#for user_book in lines:

if username inlines:

with open('../user_books/user_books.txt', 'a') as wstream:#判断之前是否借过某本书

if borrow_books not inlines:

wstream.write('{}'.format(borrow_books))print("借书成功")break

else:print("您已借过此书,请从新选择!")break

else:#将选择的图书与用户名一起保存到文件中

with open('../user_books/user_books.txt', 'a') as wstream:

wstream.write('\n{} {}\n'.format(username, borrow_books))print("借书成功")break

else:print("<>已被用户{}借走,请重新选择~".format(borrow_books,lines[0]))exceptException as err:print("错误原因:", err)#还书

defreturn_book(username):try:

with open('../user_books/user_books.txt') as rstream:#print("{}您已借阅,未归还图书如下:".format(username))

#读到的结果是列表

lines =rstream.readlines()#遍历列表,将里面的元素再拆分为列表

for i inrange(len(lines)):#去掉换行

lines[i] = lines[i].rstrip('\n')

lines[i]= lines[i].rstrip(' ')

lines[i]= lines[i].split(' ')for ii in range(len(lines[i])-1):#只打印登录用户借阅的图书

if username ==lines[i][0]:print("{}您已借阅,未归还图书如下:".format(username))print(lines[i][ii+1])

msg= input("请选择你要归还的图书:")

with open('../user_books/user_books.txt') as rstream:

lines=rstream.readlines()for i inrange(len(lines)):if username in lines[i] and msg inlines[i]:#用空字符串替换msg,即表示删除归还的图书

lines[i] = lines[i].replace(msg, '')

with open('../user_books/user_books.txt', 'w') as wstream:#将变更后的列表再写入文件,只变更当前用户的图书信息

wstream.writelines(lines)print("归还成功!")breakwith open('../user_books/user_books.txt') as rstream:

lines=rstream.readlines()for i inrange(len(lines)):

lines[i]= lines[i].rstrip('\n')

lines[i]= lines[i].rstrip(' ')

lines[i]= lines[i].split(' ')#print(type(lines[i]))

for ii inrange(len(lines[i])):#图书归还成功后判断列表中只有用户名了,如果只有用户名则将用户名用空字符串代替

if username == lines[i][0] and len(lines[i]) == 1:

lines[i][0]= lines[i][0].replace(lines[i][0], '')

lines.append(lines[i][0])#print(lines)

str = ''

for i inrange(len(lines)):for ii inrange(len(lines[i])):#将嵌套列表中的元素取出来拼接成字符串

str += lines[i][ii] + ' 'str+= '\n'

#遍历完毕删除之前列表里面嵌套的列表,追加字符串str

lines.clear()

lines.append(str)#print(lines)

#将更新后的列表写入文件

with open('../user_books/user_books.txt', 'w') as wstream:

wstream.writelines(lines)else:print("您还没有借阅记录哦~")exceptException as err:print("错误原因:", err)#查看个人信息

deflook_person_info(path,username):

with open(path) as rstream:

lines=rstream.readlines()#print(lines)

for info inlines:#分割成一个列表

info = info.split(' ')#print(info)

if username ininfo:print("----个人信息----")print("用户名:", info[0])print("邮箱:", info[1])print("密码:", info[2].rstrip(' '))#修改个人信息

defupdate_password(path,username):

tips= input("请选择操作:\n 1.修改邮箱\n 2.修改密码\n")#修改邮箱

if tips =='1':

new_email= ''line=[]try:

with open(path) as rstream:whileTrue:

line=rstream.readline()if notline:breakline= line.split(' ')#去掉密码后面的换行符

line[2] = line[2].rstrip('\n')if username ==line[0]:

new_email= input("请输入新邮箱:")

line[1] =new_emailbreak

exceptException as err:print(err)else:#将新修改邮箱后的用户的所有信息追加到文件夹

with open(path, 'a') as wstream:for i inrange(len(line)):if i ==0:#遍历列表,第一个列表元素需要前面需要加换行,后面需要加空格与其他元素分割

line[i] = '\n' + line[i] + ' '

else:

line[i]= line[i] + ' 'wstream.writelines(line)print("修改成功")#删除修改邮箱之前用户的信息

with open(path) as rstream:#读取多行

lines =rstream.readlines()

i=0

l=len(lines)while i

if username in lines[i] and new_email not inlines[i]:

lines.remove(lines[i])

i+= 1l-= 1

#删除旧邮箱对应的当前用户信息后,再将新邮箱对应的用户信息以及其他用户的信息从新写入到文件

with open(path, 'w') as wstream:

wstream.writelines(lines)#修改密码

elif tips =='2':

new_password= ''line=[]try:

with open(path) as rstream:whileTrue:

line=rstream.readline()if notline:breakline= line.split(' ')#去掉密码后面的换行符

line[2] = line[2].rstrip('\n')if username ==line[0]:

new_password= input("请输入新密码:")#判断新密码与旧密码是否一致

if new_password ==line[2]:#抛出异常

raise Exception("新密码不能与旧密码相同哦~")else:

line[2] =new_passwordbreak

#可以捕获到前面raise抛出的异常

exceptException as err:print(err)else:#将新修改密码后的用户的所有信息追加到文件夹

with open(path,'a') as wstream:for i inrange(len(line)):if i ==0:#遍历列表,第一个列表元素需要前面需要加换行,后面需要加空格与其他元素分割

line[i] = '\n'+line[i]+' '

else:

line[i]= line[i] +' 'wstream.writelines(line)print("修改成功")#删除修改密码之前用户的信息

with open(path) as rstream:#读取多行

lines =rstream.readlines()

i=0

l=len(lines)while i

if username in lines[i] and new_password not inlines[i]:

lines.remove(lines[i])

i+=1l-=1

#删除旧密码对应的当前用户信息后,再将新密码对应的用户信息以及其他用户的信息从新写入到文件

with open(path,'w') as wstream:

wstream.writelines(lines)#个人信息

defperson_information(path,username):

tips= input("请选择操作:\n 1.查看个人信息\n 2.修改个人信息\n")if tips =='1':

look_person_info(path,username)elif tips =='2':

update_password(path, username)#只有管理员才可以进行图书的增删改操作

defpermission(user_path,username):try:

with open(user_path) as rstream:whileTrue:

line=rstream.readline()#读到空行跳出循环

if notline:break

#通过3个空格将字符串line分割为一个列表,存储三个值

line = line.split(' ')#循环遍历列表,去掉列表中每个元素后面的换行,如果有就去掉,没有就不取掉

for i inrange(len(line)):

line[i]= line[i].rstrip('\n')#判断是否管理员,如果是就可以进行添加操作

if username == 'admin123':pass

else:print("只有管理员{}才可以进行该操作~".format(username))#不是管理员将回到操作页面

operate(path, username)exceptException as err:print("错误原因:",err)#图书增删改借还操作

book_path = r'/Users/mozili/PYTHONWORKSPACE/book.txt'

#book_list = ['水浒传\n','红楼梦\n','廊桥遗梦']

defoperate(b_path,username):whileTrue:

msg= input("请选择操作:\n 1.查询图书\n 2.添加图书\n 3.修改图书\n 4.删除图书\n 5.借书\n 6.归还图书\n 7.个人信息\n 8.退出登录\n")#查询图书

if msg =='1':

find_books(book_path)#添加图书

elif msg =='2':

add_book(b_path, username)#修改图书

elif msg =='3':

update_book(b_path, username)#删除图书

elif msg =='4':

del_book(b_path, username)#借书

elif msg =='5':

borrow_book(username)#还书

elif msg =='6':

return_book(username)#查看、修改个人信息

elif msg =='7':

person_information(path, username)#退出登录

elif msg =='8':

msg= input("确定退出登录吗?(yes/no)")if msg == 'yes':breaklogin()

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值