Python案例练习图书管理系统、新增图书、查看所有图书、按书名搜索、修改图书信息、删除图书、保存数据到本地文件、从文件加载数据 图书管理系统 新增图书、 查看所有图书、 按书名搜索、 修改图书信息、 删除图书、 保存数据到本地文件、 从文件加载数据 importjsonfromnumba.cudaimporttarget# 全局变量 存储所有的图书信息每一本图书用字典表示book_list[]# 数据保存的文件名DATA_FILEbooks_data.json# 加载本地json文件数据 若不存在捕获异常defload_books(): 函数功能从本地json文件加载图书数据 如果文件不存在自动预置测试图书数据 如果文件损坏初始化空列表 globalbook_listtry:# 打开文件读取withopen(DATA_FILE,r,encodingutf-8)asf:book_listjson.load(f)print(f成功从{DATA_FILE}加载{len(book_list)}本图书信息)exceptFileNotFoundError:# 文件不存在 → 预置测试数据print(数据文件不存在自动生成测试图书数据)book_list[{id:B001,name:Python编程入门,author:张三,price:49.9,count:12},{id:B002,name:数据结构与算法,author:李四,price:66.5,count:8},{id:B003,name:计算机网络,author:王五,price:38.0,count:20},{id:B004,name:MySQL必知必会,author:赵六,price:52.3,count:15},{id:B005,name:爬虫实战开发,author:钱七,price:59.0,count:6}]# 把预置数据保存到json文件save_books()exceptjson.JSONDecodeError:print(文件数据损坏清空图书库)book_list[]# 将当前图书列表保存到当前文件中持久化保存defsave_books():try:withopen(DATA_FILE,w,encodingutf-8)asf:json.dump(book_list,f,ensure_asciiFalse,indent10)returnTrueexceptExceptionase:print(f保存失败{e})returnFalse# 添加图书功能defadd_book():print( 新增图书 )# 获取用户输入book_idinput(请输入图书编号).strip()# 判断图书编号是否重复forbookinbook_list:ifbook[id]book_id:print(图书编号已经存在)returnbook_nameinput(请输入图书名称).strip()book_authorinput(请输入作者).strip()# 捕获数字输入异常try:book_pricefloat(input(请输入图书价格).strip())book_countint(input(请输入库存数量).strip())exceptValueError:print(价格必须是数字库存必须是整数)return# 构造图书字典new_book{id:book_id,name:book_name,author:book_author,price:book_price,count:book_count}# 添加到列表book_list.append(new_book)# 保存到文件save_books()print(图书添加成功)# 查看全部图书defshow_all_books():print(\n 全部图书列表 )iflen(book_list)0:print(图书没有数据)return# 打印表头print(f{编号:8}{书名:15}{作者:10}{价格:8}{库存:6})print(-*50)forbookinbook_list:print(f{book[id]:8}{book[name]:15}{book[author]:10}{book[price]:8.2f}{book[count]:6})# 检索指定的图书defsearch_book():print(\n 搜索图书 )keywordinput(请输入书名关键词).strip()result[]forbookinbook_list:ifkeywordinbook[name]:result.append(book)iflen(result)0:print(没有找到相关的书籍数据)returnprint(f{编号:8}{书名:15}{作者:10}{价格:8}{库存:6})print(-*50)forbookinresult:print(f{book[id]:8}{book[name]:15}{book[author]:10}{book[price]:8.2f}{book[count]:6})# 修改图书信息defmodify_book():print(\n 修改图书信息 )bidinput(请输入需要修改图书编号).strip()target_bookNoneforbookinbook_list:ifbidbook[id]:target_bookbookbreakiftarget_bookisNone:print(未找到该编号的图书)returnprint(直接回车则保留原有的图书内容)new_nameinput(f书名【{target_book[name]}】).strip()new_authorinput(f作者【{target_book[author]}】).strip()try:price_inputinput(f价格【{target_book[price]}】).strip()count_inputinput(f库存【{target_book[count]}】).strip()except:pass# 不为空才更新ifnew_name:target_book[name]new_nameifnew_author:target_book[author]new_authorifprice_input:target_book[price]float(price_input)ifcount_input:target_book[count]int(count_input)save_books()print(修改完成)# 删除图书根据编号删除defdelete_book():print(\n 删除图书 )bidinput(输入待删除图书编号).strip()forindex,bookinenumerate(book_list):ifbook[id]bid:# 二次确认confirminput(f确认删除《{book[name]}》y/n).strip().lower()ifconfirmy:delbook_list[index]save_books()print(删除成功)else:print(已取消删除)returnprint(找不到该图书编号)defshow_menu():打印主菜单print(\n 图书管理系统 )print(1. 添加图书)print(2. 查看全部图书)print(3. 搜索图书)print(4. 修改图书信息)print(5. 删除图书)print(0. 退出系统)print()defmain():程序主入口# 程序启动先加载历史数据load_books()whileTrue:show_menu()choiceinput(请输入功能序号).strip()ifchoice1:add_book()elifchoice2:show_all_books()elifchoice3:search_book()elifchoice4:modify_book()elifchoice5:delete_book()elifchoice0:print(退出系统再见)breakelse:print(输入无效请输入 0~5 的数字)# 程序入口判断if__name____main__:main()