1、添加商品
商品名称:商品已经存在的话,要提示
商品价格: 校验,是大于0的数字
商品数量:校验,只能是大于0的整数
2、删除商品
商品名称:商品不存在的话,要提示
3、查看商品
显示所有的商品信息
4、退出
实现的过程如下:
import json import os def is_positive_float(str1): if str1.count('.') == 1: left, right = str1.split('.') if left.isdigit() and right.isdigit(): return True else: return False elif str1.isdigit() and int(str1) > 0: return True return False def add_product(): with open('product.json', 'a+', encoding='utf-8') as f: #以a+模式打开文件,如果存在判断是否有商品 f.seek(0) #文件指针放到最前面以便读取文件 if os.path.getsize('product.json'): #有商品读出商品,放到字典里 product = json.load(f) else: product = {} #没有商品不告诉用户,直接往下走 name = input('请输入要添加的商品名称:').strip() price = input('请输入商品价格:').strip() count = input('请输入商品数量:').strip() if name in product: print('您添加的商品已经存在') elif not is_positive_float(price): print('您添加的商品价格不是大于0的数字') elif not count.isdigit() or int(count) == 0: print('您添加的商品数量不是大于0的整数') else: product.setdefault(name, {'price': eval(price), 'count': eval(count)}) with open('product.json', 'w', encoding='utf-8') as f: #以清空原文件的写模式写入完整的字典数据 json.dump(product, f, ensure_ascii=False, indent=4) def del_product(): with open('product.json', 'a+', encoding='utf-8') as f: f.seek(0) if os.path.getsize('product.json'): product = json.load(f) else: print("暂无商品,您需要先去添加商品") return #文件不存在结束函数 name = input('请输入要删除的商品名称:').strip() if name not in product: print('您输入的商品不存在!') else: product.pop(name) with open('product.json', 'w', encoding='utf-8') as f: if product: json.dump(product, f, ensure_ascii=False, indent=4) else: f.truncate() #删除了所以商品后,product是空字典,继续写入会写入{},需要直接清空字典 def show_product(): with open('product.json', 'a+', encoding='utf-8') as f: f.seek(0) if os.path.getsize('product.json'): product = json.load(f) return product else: print('暂无商品,请先添加商品') if __name__ == '__main__': T = True while T: choice = input('请输入您的选择:A or a-添加商品,D or d-删除商品,S or s-查看商品,T or t-退出程序').strip() if choice not in ('A','D','S','T','a','s','d','t'): continue elif choice == 'A' or choice == 'a': add_product() elif choice == 'D' or choice == 'd': del_product() elif choice == 'S' or choice == 's': products = show_product() if products: print(products) elif choice == 'T' or choice == 't': T = False
1,文件内容为空时使用json.load(f)报错,json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0),所以要加一个判断文件内容是否为空。
2,当文件内已有商品时,a+模式下一开始没有seek(),导致有商品也未读到内容。
3,判断输入价格是否是大于0的数字时专门定义了一个函数来判断。
4,出现一些和以前的认知不符的结果时应该找找原因,肯定是哪里出问题了才会导致这样的结果,而不是直接否定之前的认识。