json模块补充与购物车项目

上周内容回顾

  • os模块

    主要与操作系统打交道
        os.mkdir()			创建单级目录
        os.makedirs()		创建多级目录(包含单级)
        os.rmdir()			删除单级目录(空)
        os.removedirs()     删除多级目录(空)
        os.listdir()		查看指定路径下的内容名称
        os.rename()			重命名文件
        os.remove()			删除文件
        os.path.exists()	判断路径是否存在
        os.path.isdir()		判断路径是否是目录
        os.path.isfile()    判断路径是否是文件
        os.path.join()		 拼接路径
        os.path.dirname()    获取执行文件所在的目录路径
        os.path.getsize()	 获取文件大小(字节)
        os.getcwd()			获取当前工作目录
        os.chdir()			切换工作目录
    
  • sys模块

    主要与python解释器打交道
        sys.path
        sys.getrecursionlimit
        sys.setrecurionlimit
        sys.version
        sys.argv
    
  • json模块

    序列化模块
    	序列化
        	将数据类型转换成json格式字符串
    	反序列化
        	将json格式字符串转成数据类型
       
    json格式字符串
    	双引号
     
    具体操作方法
        dump()
        dumps()
        load()
        loads()
        
    ps:涉及到不同语言之间数据交互 大概率是用字典
    	{"name":"jason","pwd":123}
    
  • 模块实战演练

    注册功能
    登录功能
    

今日内容概要

  • json模块补充说明

  • 作业讲解

    思路非常的重要!!!
    

今日内容详细

json模块补充说明

import json

d = {'name': 'jason老师', 'pwd': 123}
res = json.dumps(d)  # 针对中文会自动转码  我们在查看的时候不方便
print(res)
# res = json.dumps(d, ensure_ascii=False)
# print(res)

作业讲解

1.编写一个统计指定文件类型的脚本工具
 输入指定类型的文件后缀
     eg:.txt
 并给出一个具体路径 之后统计该类型文件在该文件下的个数
  ps:简单实现即可 无需优化
import os

# 1.获取目录路径
dir_path = input('请输入目录路径>>>:').strip()  # aaa
# 2.获取指定后缀名
ends_name = input('请输入想要统计的文件后缀名>>>:').strip()  # .txt
# 3.列举目录路径下所有内容的名称
path_list = os.listdir(dir_path)  # ['a.txt', 'a1', 'a2', 'b.txt', 'c.txt', 'd.py', 'e.py']
# 4.循环获取每一个内容名称 判断是否以用户指定的文件后缀名结尾
file_num = 0
for name in path_list:
    if name.endswith(ends_name):
        file_num += 1
print(f'在{dir_path}目录第一层级 以后缀名{ends_name}结尾的文件个数有:{file_num}')
"""
1.如果出现了目录的嵌套 如何统计
    请说出大致思路  课下不用编写代码
2.只给一个目录的路径 直接统计该目录下第一层所有类型的内容数量
    .txt:3 .py:2 目录:2 课下尝试编写代码
"""     
2.针对json实操 尝试单文件多用户(一行一个)是否可实现>>>:哪个更方便
    不要求完成 单纯体会两种思路的难易
3.编程小练习
 有一个目录文件下面有一堆文本文件
     eg:
      db目录
            J老师视频合集
            R老师视频合集
            C老师视频合集
            B老师视频合集
 文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择
  用户选择哪个文件就自动打开该文件并展示内容
  涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径
import os

# 1.获取执行文件所在的路径
base_dir = os.path.dirname(__file__)  # D:/pythonProject03/day20
# 2.拼接存储文本文件的目录路径
data_dir = os.path.join(base_dir, 'data')  # D:/pythonProject03/day20/data
# 3.列举目录下所有内容名称
file_name_list = os.listdir(data_dir)  # ['B老师视频合集.txt', 'J老师视频合集.txt', 'K老师视频合集.txt', 'R老师视频合集.txt', 'Z老师视频合集.txt']
while True:  # 添加循环让项目更加的合理
    # 4.循环打印文件名供用户选择查看
    for num, file_name in enumerate(file_name_list, start=1):  # 枚举 主要用于给数据添加编号便于查看和选取
        print(num, file_name)
    # 5.等待for循环展示完毕之后 获取用户想要查看的编号
    choice_num = input('请输入您想要查看的文件编号(q)>>>:').strip()  # 获取到的用户输入是字符串 而列表索引取值需要用数字
    if choice_num == 'q':
        print('拜拜 下次再见 等你哟~')
        break
    # 6.判断用户输入是否是纯数字
    if not choice_num.isdigit():
        print('你眼瞎啊 编号只能是数字 你妹的!')
        continue
    choice_num = int(choice_num)  # 100
    # 7.判断数字是否在列表的索引范围内
    if choice_num not in range(1, len(file_name_list) + 1):  # range(1, 6)
        print('我看你是真瞎 编号不在范围内 看清楚好好输')
        continue
    # 8.索引取值获取用户想要查看的文件名称
    target_name = file_name_list[choice_num - 1]  # 'B老师视频合集.txt'
    # 9.拼接文件的绝对路径(因为站在执行文件的角度找不到文本文件)
    target_file_path = os.path.join(data_dir, target_name)
    # 10.利用文件操作打开文件并读取内容
    with open(target_file_path, 'r', encoding='utf8') as f:
        for line in f:
            print(line, end='')
    print()
    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.单个py文件采用函数版本先写 后期如果有需要再拆分成目录规范
2.先搭建项目框架
	空函数 功能字典 while循环匹配
3.注册功能
4.登录功能
5.添加购物车和结算购物车都必须要求用户登录才可以执行
	校验用户是否登录装饰器
6.添加购物车
	一定要注意购物车字典里面是否已经有历史数据 
7.结算购物车
import json
import os

# 3.校验用户名是否已存在(拼接存储用户数据的目录 拼接文件路径)
base_dir = os.path.dirname(__file__)  # 获取执行文件所在的目录路径
db_dir = os.path.join(base_dir, 'db')  # 拼接存储用户数据的目录路径
if not os.path.exists(db_dir):  # 判断路径是否存在不存在则自动创建
    os.mkdir(db_dir)

# 定义一个全局变量存储用户登陆相关的信息
is_login = {
    'username': ''  # 一旦用户登陆存储用户名 这样方便后续获取用户详细信息
}


# 校验用户是否登陆装饰器
def login_auth(func_name):
    def inner(*args, **kwargs):
        # 判断全局字典是否有值
        if is_login.get('username'):
            res = func_name(*args, **kwargs)  # 执行真正被装饰的函数 殡宫变量名res接收函数的返回值
            return res  # 返回被装饰函数执行之后的返回值
        else:
            print('你没有登陆 请先登陆')
            login()
    return inner


def register():
    while True:  # 3.添加循环
        # 1.获取用户名相关信息
        username = input('请输入用户名:').strip()
        password = input('请输入密码:').strip()
        confirm_pwd = input('请确认你的密码:').strip()
        # 2.先校验两次密码是否一致 如果输入错误应该重新执行注册程序
        if not password == confirm_pwd:
            print('密码不一致请重新注册')
            continue
        # 拼接当前用户名构成的文件路径 如果已存在则表示用户已存在 不存在则可以完成用户注册
        user_file_path = os.path.join(db_dir, f'{username}.json')
        if os.path.exists(user_file_path):
            print('用户名已存在 请重新注册')
            continue
        # 创建用户字典数据并序列化到文件中
        user_dict = {
            'username': username,
            'password': password,
            'balance': 20000,
            'shop_car': {}
        }
        with open(user_file_path, 'w', encoding='utf8')as f:
            json.dump(user_dict, f)
            print(f'用户{username}注册成功')
            break


def login():
    while True:
        # 1.获取用户名
        username = input('请输入用户名:').strip()
        # 2.判断用户是否存在
        user_file_path = os.path.join(db_dir, f'{username}.json')
        if not os.path.exists(user_file_path):
            print('用户不存在 请先注册')
            continue
        # 3.获取用户输入的密码
        password = input('请输入你的密码:').strip()
        # 4.获取当前用户对应的真实数据
        with open(user_file_path, 'r', encoding='utf8')as f:
            user_dict = json.load(f)
        # 5.判断用户输入的密码和文件中存储的真丝密码是否一致
        if not password == user_dict.get('password'):
            print('密码错误')
            continue
        # 6.完成登陆操作
        # 修改全局字典 记录当前登陆用户名
        is_login['username'] = username
        print(f'{username}登陆成功')
        return


@login_auth
def add_shop_car():
    # 8.构造临时小字典存储商品信息
    temp_shop_car = {}
    while True:
        # 1.获取商品信息(目前是写死的 后续可以动态获取)
        good_list = [
            ['挂壁面', 3],
            ['印度飞饼', 22],
            ['极品木瓜', 666],
            ['土耳其土豆', 999],
            ['伊拉克拌面', 1000],
            ['董卓戏张飞公仔', 2000],
            ['仿真玩偶', 10000]
        ]
        # 2.循环打印商品信息供用户选择
        for num, good_data in enumerate(good_list):  # 0 []
            print(f'商品编号:{num}      |           商品名称:{good_data[0]}         商品价格:{good_data[1]}')
        # 3.获取用户输入的商品编号
        choice_num = input('请输入你想要购买的商品编号(q):').strip()
        # 10.添加结束标志 用于保存购物车
        if choice_num == 'q':
            # 11.获取当前登陆用户的字典数据
            user_file_path = os.path.join(db_dir, f'{is_login.get("username")}.json')
            with open(user_file_path, 'r', encoding='utf8')as f:
                user_data_dict = json.load(f)
            old_shop_car = user_data_dict.get('shop_car')  # {'印度飞饼':[10,22]}
            # 12.保存购物车数据
            """
            user_data_dict['shop_car'] = temp_shop_car 不能直接替换 可能有原先的数据
            {"username":"jason","password":"123","balance":20000,"shop_car":{'印度飞饼':[10,22]}}
            {'印度飞饼':[1888,22],'极品木瓜':[10,666]}
            """
            for g_name, g_list in temp_shop_car.items():
                if g_name in old_shop_car:
                    old_shop_car[g_name][0] += temp_shop_car[g_name][0]
                else:
                    old_shop_car[g_name] = g_list
            user_data_dict['shop_car'] = old_shop_car
            with open(user_file_path, 'w', encoding='utf8')as f:
                json.dump(user_data_dict, f, ensure_ascii=False)
            print('添加商品成功 欢迎下次再来')
            break
        # 4.判断编号是否是纯数字
        if not choice_num.isdigit():
            print('商品编号必须是纯数字')
            continue
        choice_num = int(choice_num)
        # 5.判断数字是否超出范围
        if choice_num not in range(len(good_list)):
            print('商品编号不存在商品编号内 无法选择购买')
            continue
        # 6.根据商品编号获取商品信息
        target_good_list = good_list[choice_num]  # ['印度飞饼', 22]
        # 7.获取想要购买的商品信息
        good_num = input(f'请输入你想要购买的{target_good_list[0]}的商品数量:').strip()
        if not good_num.isdigit():
            print('商品数量必须是纯数字')
            continue
        good_num = int(good_num)
        # 9.写入临时小字典中
        """
        temp_shop_car[target_good_list[0]] = [good_num, target_good_list[1]] # t = {'印度飞饼':[10,22]} t['印度飞饼'] = [10 20] 字典的键存在会替换值
        t = {'印度飞饼':[10,20]}
        t['印度飞饼'] = [10,20]     字典的键存在会替换值
        判断是否已存在 如果存在则回去值列表 将第一个数据值数字自增用户输入的数量
        """
        good_name = target_good_list[0]
        if good_name in temp_shop_car:
            temp_shop_car.get(good_name)[0] += good_num
        else:
            temp_shop_car[good_name] = [good_num, target_good_list[1]]


@login_auth
def pay_shop_car():
    # 1.拼接当前登陆用户文件路径
    user_file_path = os.path.join(db_dir, f'{is_login.get("username")}.json')
    # 2.读取用户数据
    with open(user_file_path, 'r', encoding='utf8')as f:
        user_data_dict = json.load(f)
    # 3.获取当前用户购物车数据及账户余额
    shop_car = user_data_dict.get('shop_car')  # {'印度飞饼':[10,22],'公仔':[100,10]}
    if not shop_car:
        print('您的购物车为空 请添加商品')
        return
    current_balance = user_data_dict.get('balance')
    # 4.统计购物车商品总价
    total_money = 0
    for g_list in shop_car.values():  # [10,22]   [100,20]
        total_money += g_list[0] * g_list[1]
    # 5.比较余额是否充足
    if total_money > current_balance:
        print('账户余额不足')
        return
    user_data_dict['balance'] -= total_money
    # 6.清空购物车
    user_data_dict['shop_car'] = {}
    with open(user_file_path,'w',encoding='utf8')as f:
        json.dump(user_data_dict,f)
    print(f'尊敬的{is_login.get("username")}您本次消费{total_money} 卡上余额为{user_data_dict.get("balance")}欢迎下次光临')


func_dict = {
    '1': register,
    '2': login,
    '3': add_shop_car,
    '4': pay_shop_car
}

while True:
    print("""
        1.注册功能
        2.登录功能
        3.添加购物车
        4.结算购物车
    """)
    choice_num = input('请输入想要执行的功能编号:').strip()
    if choice_num in func_dict:
        func_name = func_dict.get(choice_num)  # 获取函数名
        func_name()  # 调用函数
    else:
        print('功能编号不存在 请重新输入')
posted @ 2022-10-26 18:43  Super小赵  阅读(54)  评论(0编辑  收藏  举报
****************************************** 页脚Html代码 ******************************************