python循环加判断加文件和时间操作(作业三完美购物车)
作业要求
要求:
1.购买时允许用户选择购买多少件
2.允许多用户登陆,下一次登陆后,继续按上次的余额购买
3.允许用户查看以前的历史记录(记录要显示购买时间)
4.商品列表分级别显示,商品要分类
5.针对自己的余额能够充值
6.显示已购买商品时,不重复打印,要在一行展示。
7.历史记录要显示购买时间和永久保存。
完成作业分析:
1.首先要完成用户登入判断,和用户基本的维护,这里多用户就必须使用用户登陆功能。
2.商品分类显示,那这里用具到了三级菜单模板。
3.所有的操作后的结果信息都要保存,那么这里就要求对文件的操作一定要熟悉
4.这里历史记录,那么就要调用时间模块了,可参考:
import time
isotime = '%Y-%m-%d-%X
gw_time=time.strftime(isotime,time.localtime())
print(gw_time)
5.需要用到对文件转入字典,字典转入文件,在这里提醒的是开始之初就不要考虑修改文件的操作,python 背身对文件操作存在弊端,那只能通过程序整理成行全新写入就可以了。
6.在这里提醒的是,我在代码中使用了函数,可以利用函数梳理模块。
看程序:
#! /usr/bin/env python # -*- coding:utf-8 -*- # Author: Delong Wang import os,time #----------------用户写入函数------------------------- def write_to_user_db_file(user_db,user_path): user_f = open(user_path, "w") for lien in user_db: liens = user_db.get(lien) (pw, state, nu,moneys) = liens val2 = ("%s %s %s %s %s\n" % (lien,pw,state,nu,moneys)) user_f.write(val2) user_f.close() #-----------------商品信息写入函数--------------------- def write_to_cy_db_file(cy_db,cy_path): cy_f = open(cy_path, "w") for lien in cy_db: val=user_db.get(lien) (sp,jg,sl)=val sp_val=("%s %s %s %s"%(sp,jg,sl,lien)) cy_f.write(sp_val) cy_f.close() #-----------------购物记录写入函数------------------- def gu_xin_writel_file(cy_dbs,gu_xin_writel_path): isotime = '%Y-%m-%d-%X' #格式化时间信息内容,注意使用此设置必须要先引入模块 gw_time=time.strftime(isotime,time.localtime()) #时间进赋值 ls_f=open(gu_xin_writel_path,"a+") print(gw_time) for ls_lien in cy_dbs: ls_liens = cy_dbs.get(ls_lien) for ls_t_lien in ls_liens: ls_t_lines=ls_liens.get(ls_t_lien) ( ls_w_jg, ls_w_nu) = ls_t_lines ls_val = ("%s %s %s %s %s\n" % (ls_lien,ls_t_lien,ls_w_jg,ls_w_nu,gw_time,)) ls_f.write(ls_val) ls_f.close() #-------------------产品信息文件更新------------------ def write_cy_db_fiel(cy_db,cy_path): #产品库更新写入函数 cy_db_f = open(cy_path,"w") for cy_db_lien in cy_db: cy_db_t_kye = cy_db.get(cy_db_lien) for cy_db_k_val in cy_db_t_kye: (dj,x_nu)=cy_db_t_kye.get(cy_db_k_val) val2 = ("%s %s %s %s \n" % (cy_db_k_val,dj,x_nu,cy_db_lien)) #格式化显示 #print(val2) cy_db_f.write(val2) #写入文件 cy_db_f.close() #----------------新用户注册程序---------------------- def useradd(): print("欢迎来到注册界面请按照流程注册") user_add_name = input("请输入你要注册的用户:") user_un=0 while user_un < u_recharge: #输入如的错误次数 user_add_pw1 = input("请输入你的密码:") user_add_pw2=input("再次请输入你的密码:") if user_add_pw1 == user_add_pw2: print("你的用户注册成功!,欢迎去购物!用户名为%s"%user_add_name ) user_db[user_add_name]={} user_db[user_add_name]=[user_add_pw1,"unlock",0,0] #写入字典 write_to_user_db_file(user_db, user_path) #调用函数写入用户函数 break else: print("密码不一致,输入错误") user_un +=1 if user_un==u_recharge: print("新用户注册失败!!!,错误次数超过%s" %user_un) #-----------------充值程序------------------------- def moneys_add(username): #资金充值函数 print("欢迎您请充值!".center(60,"-")) money_add=input("请输入你的充值的金额:").strip() #提示输入并去除空格 money_nu=0 #定义个变量值用于下一步的循环 while money_nu < u_recharge: #当小于他时 if money_add.isdigit(): #当为数字时 user_db[username][-1]=str(int(user_db[username][-1]) + int(money_add)) #相加金额 write_to_user_db_file(user_db,user_path) #调用用户信息写入函数 print("充值成功,本次充值金额为%s元".center(50,"-")%money_add) money_nu = u_recharge #成功后退出循环 else: print("输入错误请去重新输入".center(60,"-")) money_nu +=1 #错误次数累加 if money_nu==u_recharge: #超过错误次数进行提示 print("您输入的次数超过了指定次数%s次,终止充值程序".center(20,"-") %money_nu) #-------------------------购物历史信息字典---------------------------------------- def ls_xinxi_select_db_file(username,gu_xin_writel_path): #读取雷历史购物信息函数 cy_ls_dbs={} if os.path.exists(gu_xin_writel_path): #判断文件是否存在,存在就进行如下操作 ls_f=open(gu_xin_writel_path,"r") ls_line_list=ls_f.readlines() else: print(flie_Error%gu_xin_writel_path) #不存在的时候提示错误 for ls_f_line in ls_line_list: #文件进行循环 line = ls_f_line.strip().split() #转换成列表 if not line[0] in cy_ls_dbs: #判断新生成的字典如果没有此keyd的时候进行如下添加 cy_ls_dbs[line[0]]={} cy_ls_dbs[line[0]][line[1]] = line[2::] #逐个添加字典 ls_f.close() ls_user_gu__info=(username) #定义一个key,是当前的用户值 cy_ls_user_dbs=cy_ls_dbs.get(ls_user_gu__info) #取出此用户对应的所有的采购信息 if not cy_ls_user_dbs: #当为空时 print("你尚未购买过任何东西请去购物车购买".center(50,"-")) else: print("历史购物信息".center(70,"-")) print('%-5s \t%-10s \t %-15s\t%-10s\t%-10s' % ('编号', '商品名称',"采购时间", '商品价格(元)', '数量')) for ls_sp_key in enumerate(cy_ls_user_dbs): #循环打印历史记录 ls_sp_keys=ls_sp_key[1] (ls_jg,ls_nu,ls_time)=cy_ls_user_dbs[ls_sp_keys] ls_varl=("%-10s\t%-15s\t%-23s\t%-15s\t%s"%(ls_sp_key[0],ls_sp_keys,ls_time,ls_jg,ls_nu)) print(ls_varl) # --------------------------购物程序--------------------------------------------- def gouwu_list(money, cyt): cp_bat = True cy_dbs = {} # 定义一个空字典 cy_dbs[username] = {} while cp_bat: print("你已经进入了分类商品".center(60,"-")) print('%-5s \t %-20s \t%s \t%-10s' % ('编号', '商品名称', '商品价格(元)', '数量')) for kyes in enumerate(cyt): chanpin = kyes[1] (jg, nu) = cyt[kyes[1]] print("%-5s \t %-20s \t %s \t %s " % (kyes[0], chanpin, jg, nu)) print("q&quit,退出程,c&check,充值,浏览浏览购物车s&see,购物请选择对应的商品编号".center(10,"-")) s_p_in = input("请选在你要购买的商配序列号:").strip() #s_p_in_nu=input("请输入你要购买的数量:").strip() #这没有实现,测试环境下已经修改了成功了 if s_p_in.isdigit(): s_p_in = int(s_p_in) if s_p_in < len(cyt): s_p_list = list(cyt.keys()) # 转换kye 为列表 s_p_name = s_p_list[s_p_in] # 取出列表对应的值 (je, nu) = cyt.get(s_p_name) if not s_p_name in cy_dbs.get(username):#判断商品名字不存在的时候就进行下面的操作,(针对初次购买) cy_dbs[username][s_p_name] = {} #定义字典添加一个子字典 cy_dbs[username][s_p_name] = [je, 1] #给子地点赋值,其中1位采购数量 if int(money) < int(je): #进行判断当金额不足的时候提示进行如下判断 print("你的金额不足请充值".center(70,"-")) print("正在启动充值程序".center(70,"-")) moneys_add(username) #调用函数,充值函数 continue money = str(int(money) - int(je)) #进行金额计算,个人的余额减去商品的价格 nu = str(int(nu) - 1) #商品数量进行减少 cyt[s_p_name] = [je, nu] #更新商品的子数据字典 print("你购买的商品是 %s ,商品金额是%s,采购数量是%s,你的余额是%s" % (s_p_name, je, 1, money)) #user_db[username][-1] = money #write_to_user_db_file(user_db, user_path) else: #重复采购时 cy_db_k_dict = cy_dbs.get(username) #取出购物车的信息进行为小子字典 (jg, gu_nu) = cy_db_k_dict.get(s_p_name) #小子字典取值 if int(money) < int(je): #判断余额 print("你的金额不足请充值".center(70,"-")) print("正在启动充值程序".center(70,"-")) moneys_add(username) #调用充值函数 continue nu_dict = int(gu_nu) + 1 #购物车采购量累加值 nu = str(int(nu) - 1) #子商品购物字典数量更新 cyt[s_p_name] = [je, nu] #更子商品数据字典 cy_dbs[username][s_p_name] = {} cy_dbs[username][s_p_name] = [je, nu_dict] #更新购物车数据字典 money = str(int(money) - int(je)) #可用余额结算 print("你购买的商品是 %s ,商品金额是%s,采购数量%s,你的余额是%s" % (s_p_name, je, nu_dict, money)) #user_db[username][-1] = money #write_to_user_db_file(user_db, user_path) else: #当输入超出指定值时进入如下提示 print(user_in_Error1) continue elif s_p_in == "q" or s_p_in == "quit": print("退出购物不结算".center(70,"-")) cp_bat = False elif s_p_in == "s" or s_p_in == "see": #查询购物车 print('欢迎来到你的购物车,购物车信息如下'.center(70,"-")) print('%-5s \t %-20s \t%s \t%-10s' % ('编号', '商品名称', '商品价格(元)', '数量')) if not cy_dbs.get(username): #当当前用户购物信息不存在的时候就进行下面的提示,判断数据字典为空时 print("你尚未选购商品,购物车为空,请选购了商品后再来查看".center(20,"-")) continue else: #数据点有值得时候 for kyes in enumerate(cy_dbs.get(username)):#从字典循环去除当前用户的购物信息 l_cy_db = cy_dbs.get(username) #进行列表转换 chanpin = kyes[1] (jg, c_nu) = l_cy_db[kyes[1]] #进行取值 print("%-5s \t %-20s \t %s \t %s " % (kyes[0], chanpin, jg, c_nu)) print("继续购物请选择j,退出并结算请选q,直接退出程序请选择n.".center(20,"-")) guc_bat = True while guc_bat:#进入对购物车的操作循环 c_selection = input("请输入你的选择:") if c_selection == "j": #继续就跳出循环 guc_bat = False elif c_selection == "q": #退出并进行结算 print("你的余额是%s" % money.center(50,"-")) #余额提示 print("正在结算保存!!!请稍后".center(50,"-")) gu_xin_writel_file(cy_dbs, gu_xin_writel_path) #调用购物信息写函数 user_db[username][-1] = money #更新用户信息字典 write_to_user_db_file(user_db, user_path) #调用用户信息写入函数,更新用户信息表 print("购物成功,请继续购物".center(50,"-")) cp_bat = False guc_bat = False elif c_selection == "n": print("正在退出程序,所选商品未结算.".center(50,"-")) exit("退出成功欢迎下次再来".center(50,"-")) #直接退出所有的程序 else: print(user_in_Error1) else: print(user_in_Error1) #--------------------------商品类型选择---------------------------- def shangpinlei(): #定义商品列表函数 cy_db = {} if os.path.exists(cy_path): #判断文件是否存在 cy = open(cy_path, "r") cylines = cy.readlines() else: print(flie_Error%cy_path) #不存在时候进行提示并报出相应错误 cy.close() #文件转换成字典形式 for lien in cylines: #循环文件的行为列表 lien = lien.strip().split() #去除空格和换行符号 if not lien[-1] in cy_db: #当第一个key 不存在的时候进行添加对应的key cy_db[lien[-1]] = {} cy_db[lien[-1]][lien[0]] = lien[1:-1] #添加对应的values cy_b = True #定义一个标,循环的标 #进入用户采购充值菜单 while cy_b: print("请按照提示进行有效的操作".center(60,"-")) print("q&quit,退出程,c&check,充值,浏览商品y&yse,r&record,购物购物历史记录!!!".center(10,"-")) intention = input("请输入选择:") if intention == "y" or intention == "y": #判断 if_b = True while if_b: print("欢迎来到商品库,你可以选择如下商品库,进行查看同类商品".center(50,"-")) print(' %s\t%s' % ("编号", "分类")) for key in enumerate(cy_db): #列表key按照顺序循环 print(" %s \t%s" % key) #打印 print("q&quit,退出程,b&back,".center(70,"-")) key_in = input("请输入:") # if key_in.isdigit(): #判断输入是否为数字 key_in = int(key_in) #转换 if key_in < len(cy_db): #判断输入的数字是否在序列内 key_list = list(cy_db.keys()) #把key转换成列表 key_name = key_list[key_in] #取出来2级key cyt = (cy_db.get(key_name)) #通过key,得到一个新的数据字典 gouwu_list(money,cyt) #调用函数,并传值对应的变量到函数内 cy_db[key_name] = cyt write_cy_db_fiel(cy_db, cy_path) #调用产品信息文集更新函数,更新产品库。 continue else: print("选择错误".center(70,"-")) #超出序列的就提示并终止本次循环 continue elif key_in == "b" or key_in == "back": print("返回上一级".center(70,"-")) if_b = False elif key_in == "q" or key_in == "quit": print("你选在退出程序".center(70,"-")) if_b = False cy_b = False elif intention == "q" or intention == "quit": print("您选择了退出购物程序!!!".center(70,"-")) cy_b = False elif intention == "c" or intention == "check": moneys_add(username) #调用充值函数 continue elif intention == "r" or intention == "record": print("正在展示历史信息。。。。。。".center(70,"-")) ls_xinxi_select_db_file(username, gu_xin_writel_path) print("以上是你的历史购物信息".center(70,"-")) else: print(user_in_Error1) continue if __name__ == '__main__': #---------------------定义变量值-------------------------------------------- user_path="users_db.txt" #用户信息文件 cy_path="cy_warehouse.txt" #商品信息文件 gu_xin_writel_path="gwlsjldb.txt" u_login=int(3) #定义登陆可允许错误次数 u_register=int(3) #定义注册可允许错误次数 u_recharge=int(3) #定义充值可允许错误次数 info_val=''' ********************************************** * 欢迎来到东城购物! * **************q&quit退出本次程序***************`''' welcome_msg = "欢迎 %s,你已经成功登入!,你的可用余额是%s(元)." flie_Error="加载%s文件失败程序故障请稍后再试!!!".center(40,"-") user_Error1="用户错误用户信息不存在".center(60,"-") user_Error2="你注册的用户已被锁定".center(70,"-") user_Error3="你输入的用户名和密码错误".center(60,"-") user_Error4="错误:你的错误次数为%s,账户被锁定。".center(40,"-") user_in_Error1="您的输入有误!!!,请重新输入!!!".center(50,"-") #判断用户信息文件是否存在 if os.path.exists(user_path):#判断文件是否存在,存在的时候进行开启 user_f = open(user_path, "r") line_list = user_f.readlines() else: print(flie_Error%user_path) #读取文件内容,并对文件内容格式化(转换数据字典)。 user_db ={} for line in line_list: #转换成可以字典 line = line.strip().split() user_db[line[0]]={} user_db[line[0]]= line[1::] user_f.close() print(info_val) flag=True #定义一个循环标识值 while flag: print("请输入正确的选择".center(50,"-")) username=input("请输入你的用户名:").strip() if username =="q" or username=="quit": #判断是否退出程序 flag=False #是则退出循环 else: pw=input("请输入你的密码:").strip() if username not in user_db: #判断用户是否存在 print(user_Error1) s_value=input("你要注册吗?y&yes,退出前选择q&quit:") #判断是否注册,选择正确进行注册 if s_value=="y"or s_value=="yes": useradd() elif s_value=="q"or s_value=="quit": #判断选择(退出选择) print("您选择不注册!!!".center(70,"-")) flag=False else: print(user_in_Error1) continue if user_db[username][1] =="lock": #判断用户是否被锁,如果是被锁了就退出当前循环 print(user_Error2) continue if pw ==user_db[username][0] : #如果密码正确提示欢迎信息 money=user_db[username][-1] print(welcome_msg.center(20,"-") %(username,money)) shangpinlei() #print(money) flag = False else: #密码不正确的时候 print(user_Error3) #提示用户名密码错误 user_db[username][-2]=str(int(user_db[username][-2]) + 1) #错误次数计数 if int(user_db[username][-2])== u_login: #判断错误次数 locks=user_db[username][-2] print(user_Error4 %locks) #打印错误信息 user_db[username][1]="lock" #修改当前用户状态 write_to_user_db_file(user_db,user_path) break
几个小知识点
1.把字典写入文件操作,下面是我定义的一个函数。
def write_to_user_db_file(user_db,user_path): user_f = open(user_path, "w") for lien in user_db: liens = user_db.get(lien) (pw, state, nu,moneys) = liens val2 = ("%s %s %s %s %s\n" % (lien,pw,state,nu,moneys)) user_f.write(val2) user_f.close()
写入后效果:
2.把文件转换成字典
先看文件内容
转换使用代码:
cy_db={} cy_path="cy_warehouse.txt" cy=open(cy_path,"r") cylines=cy.readlines() cy.close() for lien in cylines: lien = lien.strip().split() if not lien[-1] in cy_db: cy_db[lien[-1]] = {} cy_db[lien[-1]][lien[0]] = lien[1:-1] print(cy_db)
看得到结果:
{'jiaju': {'MARJAKURKI9x0': ['1260', '60'], 'FOOJO230': ['998', '50'], 'PHIALEE5L': ['4998', '20'], 'PHILIPS_LED': ['4499', '40'], 'FUANNAl18': ['499', '50'], 'BenQwit': ['1899', '200']}, 'pcbook': {'LenovoIsk7': ['5499', '20'], 'DELL15PR': ['5499', '30'], 'MacBook': ['9280', '15'], 'MacBookPor': ['13688', '30'], 'MacBookAir': ['6988', '30'], 'HPx965': ['6999', '40']}, 'jiadian': {'xmdianshi3': ['2099', '19'], 'KONKAe330c': ['1099', '14'], 'HisenseC520': ['3299', '17'], 'CHANGHONG55G': ['3999', '19'], 'LeTVs50': ['2205', '24'], 'SkyworthT780': ['2999', '14']}}
那么这样看就得到想要的数据字典了。

浙公网安备 33010602011771号