python学习Day24

Day 24

今日内容概要

  • 时间模块之datetime模块
  • os模块
  • sys模块
  • json模块
  • json模块的实操

今日内容详细

#py文件名称尽量不要与模块名(内置、第三方)冲突
1.datetime模块
1.
    import datetime
    res=datetime.datetime.today()#获取年月日时分秒(秒很精确)
    print(res)#2022-07-15 15:38:47.867384
    res1=datetime.date.today()#获取年月日
    '还可以通过点的方式点出来想要的日期如:'
    print(res1)#2022-07-15
    print(res.year)#年
    print(res.month)#月
    print(res1.isoweekday())#星期几
    '''
    date      年月日
    time      时分秒
    datetime  年月日时分秒
    '''
2.
    tl = datetime.timedelta(days=3)#定义一个时间差值
    print(res1 + tl)  # 2022-07-18
    print(res1 - tl)  # 2022-07-12
    '''
    括号内可以添加很多参数 没有的时间可以换算得到
    '''
2.os模块
os模块主要是跟当前程序所在的操作系统打交道

import os
1.创建目录
	os.mkdir(r'aaa')#创建单级目录(创建在当前执行执行文件所在的路径下)
	os.makedirs(r'bbb\ccc\ddd')#可以创建单级与多级目录
2.删除目录
	os.rmdir(r'aaa')#可以删除空的单级目录(目录下不能有任何东西,仅能删空白文件夹)
	os.removedirs(r'bbb\ccc\ddd')#可以删除空的多级目录(目录内不能有任何东西,从内到外删除直到某个目录内有其他数据为止)
3.获取指定路径下的文件名称(包含文件、目录)
	print(os.listdir())#列举当前执行文件所在路径下所有文件夹、文件名称,结果是列表
	print(os.listdir(r'D:\\'))#把D盘所有文件名字列举出来
4.重命名文件,删除文件
    os.rename(r'a.txt',r'aaa.txt')#把a.txt重命名为aaa.txt
    os.remove(r'a.txt')#删除该文件
5.获取当前工作路径(当前所在的绝对路径)#结果与下面dirname一样,下面的更常用
    print(os.getcwd())#D:\pythonProject\day20
    os.chdir(r'..')#上一层路径 切换路径
    print(os.getcwd())#D:\pythonProject
6.与程序启动文件相关
	#获取当前文件所在的绝对路径(可以不记)
	print(os.path.abspath(__file__))#D:\pythonProject\day20\lx1.py
    
	#获取当前执行文件所在的根目录路径(必须记).
	print(os.path.dirname(__file__))#D:\pythonProject\day20
    #且可支持嵌套(往上一层)如day23的解决办法1
	res=os.path.dirname(os.path.dirname(__file__))#D:/pythonProject赋值给res
    sys.path.append(res)#把该目录文件添加到sys.path模块查询路径列表中,这样无论把该目录放在哪个位置都可以运行
7.判断路径(文件、目录)是否存在
	  print(os.path.exists(r'bbb'))#True
	  print(os.path.exists(r'sdfafdaf'))#False
    isdir:只用于判断路径是否是目录(文件夹)
      print(os.path.isdir(r'ccc'))#True
      print(os.path.isdir(r'lx1.py'))#False
    isfile:只用于判断路径是否是文件
      print(os.path.isfile(r'ccc'))#False
      print(os.path.isfile(r'lx1.py'))#True
8.拼接路径 join
	eg:在以下路径中把a.txt拼接进去
        #涉及到路径拼接,不要使用加号,应该用os模块中的join方法
        absolute_path=r'D:\pythonProject\day20\ccc\ddd\eee'
        relative_path='a.txt'
        res=os.path.join(absolute_path,relative_path)
        print(res)#D:\pythonProject\day20\ccc\ddd\eee\a.txt
   # ps:join方法可以自动识别当前的操作系统并自动转换分隔符 windows用\   mac用/
9.获取文件大小  单位是字节bytes
	print(os.path.getsize(r'lx1.py')) #844
3.sys模块
sys模块主要是跟python解释器打交道

import sys
print(sys.path)#当前执行文件所在的系统变量 结果是列表
print(sys.version)#获取当前解释器版本信息
print(sys.platform)#查看当前平台
______________________________________________________
res = sys.argv
'需求:只能用命令行执行当前文件且必须提供用户名和密码 否则不执行'
if len(res) == 3:
    name = res[1]
    pwd = res[2]
    if name == 'jason' and pwd == '123':
        print('正在执行该文件')
    else:
        print('用户名或密码错误')
else:
    print('需填写用户名和密码')
# 上述校验也可以使用异常捕获实现 python解释器下方点击Terminal就可以和cmd一样
4.json模块
json模块也叫序列化模块,是不同编程语言之间数据交互必备的模块(处理措施)
#不同编程语言之间数据类型存在差异,无法直接交互

json格式的数据是什么?
	数据基于网络传输肯定是二进制 那么在python中只有字符串可以调用encode(编码)方法转换成二进制数据 所以json格式的数据也属于字符串

json格式的数据有一个非常明显的特征
	1.肯定是字符串   2.引号是标志性的双引号
    
d = {'name':'jason','pwd':123}
import json
res=json.dumps(d)#序列化  将其他数据类型转换成json格式字符串
print(res,type(res))#{"name": "jason", "pwd": 123} <class 'str'>

res1=json.loads(res)#反序列化  将json格式字符串转换成对应编程语言的数据类型(自动识别编程语言转换)
print(res1,type(res1))#{'name': 'jason', 'pwd': 123} <class 'dict'>
    
——————————————————————————————————————————————————————————————————————
eg:
#需求:将字典保存到文件中,并且将来读取出来后还是字典
    错误示范
d = {'name':'jason','pwd':123}
with open(r'b.txt','w',encoding='utf8')as f:
    f.write(str(d))
with open(r'b.txt','r',encoding='utf8')as f:
    data=f.read()
    print(data,type(data))#{'name': 'jason', 'pwd': 123} <class 'str'>
——————————————————————————————————————————————————————————————————————
#上述方法写入读取后字典变成了字符串,所以需要用json模块
	正确示范
d = {'name':'jason','pwd':123}
import json
with open(r'b.txt','w',encoding='utf8')as f:
 '''f.write(json.dumps(d))
 '''json.dump(d,f)#jason自动帮我们写入完成转换(快捷方式)
with open(r'b.txt','r',encoding='utf8')as f:
 '''data=f.read()
    res=json.loads(data)
 '''res=json.load(f)#jason自动帮我们转换回来(快捷方式)
    print(res,type(res))#{'name': 'jason', 'pwd': 123} <class 'dict'>
json模块的两种方式
''' 多用户单文件
dumps()  将其他数据类型转换成json格式字符串
loads()  将json格式字符串转换成对应的数据类型
'''
import json
dict={'name':'jason','pwd':123}
print(json.dumps(dict))
#第一种是仅把数据类型转换为json格式


''' 单用户单文件
dump()   将其他数据类型直接以json格式字符串写入文件
load()   将文件中json格式字符串读取出来并转换成对应的数据类型
'''
import json
dict={'name':'jason','pwd':123}
with open(r'a.txt','w',encoding='utf8')as f:
    json.dump(dict,f)#把数据写入字典中,json自动帮你转换格式
with open(r'a.txt','r',encoding='utf8')as f:
    res=json.load(f)#把json格式的f文件内容(字符串字典)转换回字典
    print(res)
#第二种是写入文件,json自动帮转换格式
5.json模块的实操
'注册登录功能:单文件单用户(一行一个)'

注册功能

import json
import os
#1.创建用来存储用户数据的'db'文件夹之前先判断一下是否存在
#1.1.获取当前项目根目录
directory=os.path.dirname(__file__)#D:/pythonProject/day24
#1.2.用join拼接一个db文件夹的路径来判断是否存在
db_path=os.path.join(directory,'db')#D:/pythonProject/day24\db
#1.3.判断如果该路径不存在则创建db目录
if not os.path.exists(db_path):
    os.mkdir('db')
#2.获取用户信息存入字典中并创建一个该用户名的json文件来存储单用户信息
#2.1.获取用户信息
name=input('输入用户名:').strip()
pwd=input('输入密码:').strip()
#2.2.构造字典把用户信息放入字典中
user_dict={'name':name,
           'pwd':pwd,
           'balance':15000,
           'shop_car':[]}
#2.3.创建一个该用户的json文件前,先把该json文件路径用join拼接出来
file_path=os.path.join(db_path,r'%s'%name)
#2.4.写入模式打开db文件夹中的用户json文件,如果没有则创建
with open(file_path,'w',encoding='utf8')as f:
    #2.5.把字典中的用户数据用json序列化格式写入用户json文件中
    json.dump(user_dict,f)
——————————————————————————————————————————————————————————————————
登录功能

import json
import os
#1.获取用户登录信息
name=input('输入用户名:').strip()
#2.获取db文件的路径然后判断用户登录的用户名是否存在db文件夹内
#2.1.获取当前路径的根目录
directory=os.path.dirname(__file__)#D:/pythonProject/day24
#2.2.把db文件夹路径用join拼接 添加到根目录中
db_path=os.path.join(directory,'db')#D:/pythonProject/day24\db
#2.3.获取db文件夹内的所有文件
db_list=os.listdir(db_path)#['jason', 'torry']
#2.4.判断如果用户输入的用户名在db文件夹内则获取文件中的用户信息
if name in db_list:
    pwd=input('输入用户密码:').strip()
    #2.5.拼接该名字对应的绝对路径
    file_path=os.path.join(db_path,name)#D:/pythonProject/day24\db\jason
    #2.6.读取该用户文件信息
    with open(file_path,'r',encoding='utf8')as f:
        #2.7.用反序列化格式提取出用户字典信息
        dict=json.load(f)#{'name': 'jason', 'pwd': '123', 'balance': 15000, 'shop_car': []}
        #2.8.判断用户名与密码是否正确
        if name==dict['name'] and pwd==dict['pwd']:
            print('登录成功')
        else:
            print('密码错误')
else:
    print('用户名不存在')

作业

整理今日内容及博客 周日下午或晚上记得完成周总结!!!

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.编写一个统计指定文件类型的脚本工具
 	输入指定类型的文件后缀
     	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-15 23:28  逢诱  阅读(30)  评论(0)    收藏  举报