python学习Day25

Day 25

今日内容详细

  • 掌握昨日四大作业尤其是购物车
1.昨日作业
1.编写一个统计指定文件类型的脚本工具
	输入指定类型的文件后缀
    	eg:.txt
	并给出一个具体路径 之后统计该类型文件在该文件下的个数
 	ps:简单实现即可 无需优化
2.针对json实操 尝试单文件多用户(一行一个)是否可实现 哪个更方便
3.编程小练习
	有一个目录文件下面有一堆文本文件
    	eg:
    		db目录
            J老师视频合集
            R老师视频合集
            C老师视频合集
            B老师视频合集
	文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择
 	用户选择哪个文件就自动打开该文件并展示内容
 	涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径
4.周末大作业(尝试编写)
	# 项目功能
  		1.用户注册
    	2.用户登录
    	3.添加购物车
    	4.结算购物车
	# 项目说明
  		用户数据采用json格式存储到文件目录db下 一个用户一个单独的文件
    	数据格式 {"name":"jason","pwd":123} 
       		# ps:文件名可以直接用用户名便于校验
    	用户注册时给每个用户添加两个默认的键值对(账户余额 购物车)
    		{"balance":15000,"shop_car":{}}
    	添加购物车功能 商品列表可以自定义或者采用下列格式
            good_list = [
                    ['挂壁面',3]
                    ['印度飞饼', 22]
                	['极品木瓜', 666], 
                	['土耳其土豆', 999],  
                	['伊拉克拌面', 1000],  
                	['董卓戏张飞公仔', 2000],  
                	['仿真玩偶', 10000] 
            ]
      用户可以反复添加商品,在购物车中记录数量
      		{'极品木瓜':[个数,单价]}
    	结算购物车
    		获取用户购物车中所有的商品计算总价并结算即可
	 针对添加购物车和结算只有登录的用户才可以执行
#购物车思路
1.前期不熟练的情况先不要采用软件开发目录规范
	先编写功能 写完之后再慢慢拆分
	ps:等我们熟练的之后 应该上来就拆分
2.可以先搭建项目的整体框架 最后再编写核心逻辑
    1.空函数
    2.功能字典
    3.循环
3.注册功能
	先看注册功能的要求 其他功能先不用看
    	先写注册的主体逻辑
		之后再考虑用户名是否冲突等补充逻辑
    1.动态创建db文件夹
    2.获取用户数据
    3.拼接存储用户数据的文件路径
    4.判断文件路径是否存在
    5.如果存在则表示用户名已注册
    6.如果不存在则构建用户字典(诸多键值对)
    7.json序列化到文件中
4.登录功能  直接编写主体功能即可 没有太多复杂的优化操作
    1.获取用户数据
    2.拼接存储用户数据的文件路径
    3.判断文件路径是否存在
    4.如果存在则获取文件中用户的真实数据
    5.根据真实数据与用户输入的数据对比
    6.使用全局大字典记录用户的登录状态(用户名)
    7.如果不存在则提示错误
5.校验用户是否登录装饰器
    1.装饰器模板
    2.根据全局大字典是否存储了用户名判断是否可执行被装饰函数
6.添加购物车(一定要多练多敲 搞懂它就是翻过一座山)
    1.校验用户身份(装饰器自动完成)
    2.循环打印商品数据(枚举)
    3.获取用户输入的商品编号
    4.针对编号做一些比较小的完善处理(纯数字 范围)
    5.根据编号获取对应的商品数据
    6.获取用户购买的数量
    7.创建一个临时购物车字典存储用户想要购买的商品(循环外面)
    8.获取用户真实数据中的购物车
    9.判断购物车是否已有商品数据
    10.如果有则自增数量
    11.如果没有则采用新增键值对
    12.将用户数据重新序列化到文件中
7.结算购物车
    1.通过登录的用户名获取用户数据
    2.获取购物车数据
    3.计算购物车商品的总价
    4.判断总价是否小于用户商户余额
    5.如果小于则完成扣款并清空购物车 最后重新写入
    6.如果大于则提示余额不足并保持购物车不变
1.昨日四大作业
1.编写一个统计指定文件类型的脚本工具
 	输入指定类型的文件后缀
     	eg:.txt
 	并给出一个具体路径 之后统计该类型文件在该文件下的个数
  	ps:简单实现即可 无需优化

import os
count=0
#1.获取用户想要查看的路径地址
path=input('输入您要查看的路径地址:').strip()
#1.1.把该路径下的所有文件名用os.listdir()方法统计出来并赋值给file_name
file_name=os.listdir(path)#['.idea', 'db', 'work1.py', 'work2.py', 'work3.py']
#2.获取用户想要查看的文件名后缀
file_suffix=input('输入您要查看的文件后缀名:').strip()
#3.利用for循环,循环打印出该路径下的所有文件名,然后用字符串内置方法.endswith来判断字符串结尾
for i in file_name:
    if file_suffix in i:
        count+=1
print(f'{file_suffix}后缀名共出现{count}次')

'''
该题主要运用到两个大的知识点
1.os模块下 os.listdir()获取当前路径下所有的文件名,结果是列表套字符串型式
2.字符串的内置方法 .endswith 判断字符串结尾是不是某个字符
小知识点:
1.循环打印出列表中的数据
2.定义计数器,判断如果结尾是某个数据则让count自增1,此处不用加else因为就算结尾没有该数据,最后打印出来的计数器就是0代表没有
'''
2.针对json实操 尝试单文件多用户(一行一个)是否可实现 哪个更方便

import json
d={'name':'jason1','pwd':123}
#写入
with open(r'info.json','a',encoding='utf8')as f:
    # json.dump(d,f) #dump无法实现换行多次写入
    res=json.dumps(d)
    f.write(res)
    f.write('\n')
#提取
with open(r'info.json','r',encoding='utf8')as f:
    for i in f:
        new_i=i.strip('\n')
        res=json.loads(new_i)
        print(res,type(res))#{'name': 'jason', 'pwd': 123} <class 'dict'>
        
        
 '针对json格式数据 单用户单文件更方便(dump load)'  
3.
编程小练习
有一个目录文件下面有一堆文本文件
eg:
db目录
J老师视频合集
R老师视频合集
C老师视频合集
B老师视频合集
文件内容自定义即可
要求循环打印出db目录下所有的文件名称让用户选择
用户选择哪个文件就自动打开该文件并展示内容
涉及到文件路径全部使用代码自动生成
不准直接拷贝当前计算机固定路径

import os
import json

while True:
    print('''
        1.添加老师视频文件
        2.查看db目录文件
    ''')
    choice = input('输入指令:').strip()
    if choice == '1':
        # 准备工作:1.创建db目录 2.创建各老师的文本文件并在文件中写入内容
        # 1.创建db目录,在创建前先判断是否存在方便多次执行写入文本文件
        # 1.1.获取当前项目根目录
        directory = os.path.dirname(__file__)  # D:/pythonProject/day24
        # 1.2.用join拼接一个db文件夹的路径来判断是否存在
        zb_db_path = os.path.join(directory, 'db')  # D:/pythonProject/day24\db
        # 1.3.判断如果不存在则创建db目录
        if not os.path.exists(zb_db_path):
            os.mkdir('db')
        # 2.在db目录中创建各老师文本文件并写入内容
        # 2.1.获取各个老师文件名
        zb_file_name = input('输入老师文件名:').strip()
        print(f'{zb_file_name}创建成功')
        # 2.2.创建一个在各个老师文件中写入的乱七八糟信息
        zb_info = f'这里是{zb_file_name}'
        # 2.3.创建各老师文件前把该老师文件绝对路径用join拼接出来
        zb_file_path = os.path.join(zb_db_path, zb_file_name)
        # 2.4.写入模式打开db文件夹中的该老师文件,如果没有则创建
        with open(zb_file_path, 'w', encoding='utf8')as f:
            # 2.5.给该老师文本文件中写入内容
            f.write(zb_info)
            continue
    elif choice == '2':
        import os

        # 3.1.获取当前根目录文件
        directory = os.path.dirname(__file__)  # D:/pythonProject/day24
        # 3.2.用join拼接一个db文件夹的路径
        db_path = os.path.join(directory, 'db')  # D:/pythonProject/day24\db
        # 3.3.获取db目录下的所有文件赋值给db_file
        db_file = os.listdir(db_path)  # ['A老师视频合集', 'B老师视频合集', 'J老师视频合集']
        #3.4.用for循环打印出目录中的各个文件,并用枚举enumerate方法给文件分别赋一个索引值
        for i,j in enumerate(db_file,start=1):
            print('       (',i,')',j)
        choice1 = input('输入要查看的视频编号:').strip()
        #3.5.判断用户输入的如果不是纯数字则打印错误并返回
        if not choice1.isdigit():
            print('编号错误')
            continue
        choice1=int(choice1)
        #3.6.判断用户输入的编号是否在文件数量范围内
        if choice1 not in range(len(db_file)+1):
            print('编号有误')
            continue
        #3.7.获取用户输入的该文件
        file_name=db_file[choice1-1]#A老师视频合集
        #3.8.用join方法拼接一个该文件的绝对路径
        teacher_path = os.path.join(db_path,file_name)#D:/pythonProject/day24\db\A老师视频合集
        with open(teacher_path,'r',encoding='utf8')as f:
            print(f.read())
    else:
        print('指令有误')
4.周末大作业(尝试编写)
	# 项目功能
  		1.用户注册
     	2.用户登录
     	3.添加购物车
     	4.结算购物车
	# 项目说明
   		用户数据采用json格式存储到文件目录db下 一个用户一个单独的文件
     	数据格式 {"name":"jason","pwd":123}
        		# ps:文件名可以直接用用户名便于校验
    	用户注册时给每个用户添加两个默认的键值对(账户余额 购物车)
    		{"balance":15000,"shop_car":{}}
    	添加购物车功能 商品列表可以自定义或者采用下列格式
            good_list = [
                    ['挂壁面',3]
                    ['印度飞饼', 22]
                	['极品木瓜', 666],
                	['土耳其土豆', 999],
                	['伊拉克拌面', 1000],
                	['董卓戏张飞公仔', 2000],
                	['仿真玩偶', 10000]
            ]
      用户可以反复添加商品,在购物车中记录数量
      		{'极品木瓜':[个数,单价]}
    	结算购物车
    		获取用户购物车中所有的商品计算总价并结算即可
# 	 针对添加购物车和结算只有登录的用户才可以执行

#1.先构造核心框架(定义各个功能函数、创建功能字典(用户输入哪个编号就执行哪个函数)、3.打印功能列表,获取用户输入的编号)
#2.编写各功能函数体代码
import json
import os
#1.先获取执行文件所在的路径
base_dir=os.path.dirname(__file__)#D:/pythonProject/day24
print(base_dir)
#2.拼接db文件夹的路径
db_dir=os.path.join(base_dir,'db')#D:/pythonProject/day24\db
#3.判断db路径是否存在,如果不存在就创建db目录
if not os.path.exists(db_dir):
    os.mkdir(db_dir)

#创建全局标志位,当用户登录了就把None改为用户名字
is_login={'username':''}
#校验用户登录装饰器
def login_auth(func_name):
    def inner(*args,**kwargs):
        #1.判断全局标志位字典内username是否有值
        if is_login.get('username'):
            res=func_name(*args,**kwargs)
            return res
        else:
            print('您未登录需先登录')
            login()#调用一个登录函数让用户去登录
    return inner

def register():
    while True:
    #1.获取用户名和密码
        username=input('输入注册用户名:').strip()
        password=input('输入注册密码:').strip()
        confirm_pwd=input('再次输入注册密码:').strip()
        #2.判断如果两次密码不一致则返回重新输入
        if not password==confirm_pwd:
            print('两次密码不一致重新输入')
            continue
        #2.2.判断用户名是否存在(方式1:os.listdir()  方式2:拼接用户名文件路径)
        # 4.拼接存储用户数据的json文件完整路径
        file_path = os.path.join(db_dir, '%s.json' % username)  # D:/pythonProject/day24\db\jason.json
        if os.path.exists(file_path):
            print(f'用户名{username}已存在')
            continue
        #3.构建临时的用户字典数据
        temp_user_dict={'name':username,
                        'pwd':password,
                        'balance':15000,
                        'shop_car':{}}
        #4.拼接存储用户数据的json文件完整路径
        file_path=os.path.join(db_dir,'%s.json'% username)#D:/pythonProject/day24\db\jason.json
        #5.将用户字典序列化到该用户json文件中
        with open(file_path,'w',encoding='utf8')as f:
            json.dump(temp_user_dict,f)
        print(f'{username}注册成功')
        return
def login():
    while True:
        #1.获取用户名和密码
        username=input('输入用户名:').strip()
        password=input('输入密码:').strip()
        #2.拼接当前用户文件路径用来判断是否存在该用户的文件
        file_path=os.path.join(db_dir,'%s.json'%username)#D:/pythonProject/day24\db\jason.json
        #3.判断该文件路径是否存在(存在则代表有该用户,不存在就是没有)
        if not os.path.isfile(file_path):
            print('用户名不存在')
            continue
        #4.根据文件路径获取对应用户字典数据
        with open(file_path,'r',encoding='utf8')as f:
            user_dict=json.load(f)#{'name':'jason','pwd':'123','balance':15000,'shop_car':{}}
        #5.判断用户密码是否一致
        if password == user_dict.get('pwd'):
            # 在全局标志位里保存登录用户的用户名
            is_login['username']=user_dict.get('name')
            print(f"用户{user_dict.get('name')}登录成功")
            return
        else:
            print('密码错误')
@login_auth
def add_shop_car():
    #1.获取商品数据(写死,如需维护则要专门建立一个文件)
    good_list =[
        ['挂壁面条',3],
        ['印度飞饼',22],
        ['极品木瓜',666],
        ['狼牙土豆',999],
        ['非洲拌面',1000],
        ['董卓公仔',2000],
        ['仿真玩偶',10000]]
    #定义一个临时存储用户要购买的商品字典数据 {'挂壁面条':[个数,单价],['印度飞饼  ',22]}
    temp_shop_dict = {}
    #2.循环打印商品数据获取用户购买商品
    while True:
        #3.打印商品数据
        for i,j in enumerate(good_list):#i编号  j列表
            print(f'商品编号:{i}    商品名称:{j[0]}    商品单价{j[1]}')
        #4.获取用户想要添加的商品编号
        target_good_id=input('输入要购买的编号(q退出购买):').strip()
        #当用户输入q时则把临时购物车中的数据添加到该用户文件购物车中
        if target_good_id=='q':
            #拼接当前登录用户文件数据
            file_path=os.path.join(db_dir,'%s.json'%is_login.get('username'))
            #获取当前用户的具体数据
            with open(file_path,'r',encoding='utf8')as f:
                user_dict=json.load(f)#{"name":"jason","pwd":"123","balance":15000,"shop_car":{}}
            #获取用户文件中的购物车数据然后判断里面是否有东西,有则叠加
            old_shop_car=user_dict.get('shop_car')#shop_car":{不确定里面有没有购买商品}
            #for循环当前临时购物车中的商品名称,判断是否在该用户文件购物车中的已存在,有则自增数量,没有就新增
            for good_name in temp_shop_dict:
                if good_name in old_shop_car:
                    old_shop_car.get(good_name)[0] += temp_shop_dict.get(good_name)[0]
                else:
                    old_shop_car[good_name]=temp_shop_dict.get(good_name)
            #写入该用户文件中
            user_dict['shop_car']=old_shop_car
            with open(file_path,'w',encoding='utf8')as f:
                json.dump(user_dict,f)
            print('添加购物车成功')
            return
        #5.判断编号是否是纯数字,是否在范围内
        if not target_good_id.isdigit():
            print('商品编号必须是纯数字')
            continue
        target_good_id=int(target_good_id)
        if target_good_id not in range(len(good_list)):
            print('没有该商品编号')
            continue
        #6.根据用户输入的商品编号获取商品信息
        target_good_info=good_list[target_good_id]#['挂壁面条  ',3]
        target_good_name=target_good_info[0]#挂壁面条  商品名称
        target_good_price=target_good_info[1]#3      商品单价
        #7.获取用户想要购买的数量
        target_good_num=input('请输入购买数量:').strip()
        #判断如果用户输入的不是纯数字
        if not target_good_num.isdigit():
            print('数量有误需重新输入')
            continue
        target_good_num=int(target_good_num)
        #8.把用户要购买的商品名称和数量添加到临时存储用户购物车字典中(需先判断购物车中是否已有该商品,有则获取对应数量自增)
        # temp_shop_dict[target_good_info[0]]=[target_good_num,target_good_info[1]]#{'挂壁面条':[个数,单价]}
        if target_good_name in temp_shop_dict:
            #获取已有数量然后自增
            value_list=temp_shop_dict.get(target_good_name)#对应商品的[个数,单价]
            value_list[0]+=target_good_num #已有数量+新购买数量
            #再把更新后的数据写进临时购物车中
            temp_shop_dict[target_good_name]=value_list
        else:
            temp_shop_dict[target_good_name]=[target_good_num,target_good_price]
        print(f'当前购物车:{temp_shop_dict}')


@login_auth
def buy_shop_car():
    #1.拼接用户文件完整路径
    file_path=os.path.join(db_dir,'%s.json'%(is_login.get('username')))
    #2.读取用户数据
    with open(file_path,'r',encoding='utf8')as f:
        user_dict=json.load(f)
    # print(user_dict)
    #3.获取购物车商品数据
    shop_cat=user_dict.get('shop_car')
    if not shop_cat:
        print('未购买商品')
        return
    #4.计算商品总价
    total_money=0
    current_balance=user_dict.get('balance')
    for values in shop_cat.values():
        total_money += values[0] * values[1]
    #5.判断余额是否足够
    if current_balance>=total_money:
        rest_money=current_balance-total_money
        user_dict['balance']=rest_money
        user_dict['shop_car']={}
        with open(file_path,'w',encoding='utf8')as f:
            json.dump(user_dict,f)
        print(f'今日消费:{total_money},卡上余额:{rest_money}')
    else:
        print('余额不足')
        return

#功能字典
func_dic={'1':register,
          '2':login,
          '3':add_shop_car,
          '4':buy_shop_car
          }
#打印功能列表并获取用户指令
while True:
    print("""
    1.注册功能
    2.登录功能
    3.添加购物车
    4.结算购物车
    """)
    choice=input('请输入功能编号:').strip()
    #如果编号在功能字典中则用.get()取值,加括号调用函数
    if choice in func_dic:
        func_dic.get(choice)()
    else:
        print('输入有误')
posted @ 2022-07-19 22:05  逢诱  阅读(74)  评论(0)    收藏  举报