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
View Code

 

几个小知识点

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']}}

那么这样看就得到想要的数据字典了。

 

 

 


 
posted @ 2016-09-14 09:52  DelongWang  阅读(214)  评论(0)    收藏  举报