首页 > 其他分享 >实战练习

实战练习

时间:2022-10-25 14:45:26浏览次数:38  
标签:实战 shop car 练习 user file print path

实战练习

作业讲解

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

# 1.获得目标路径
import os

dir_path = input("请输入一个具体的路径>>>>:").strip()  # D:\PycharmProjects\day20

#2.获取指定后缀名
ends_name = input("请输入想要统计的文件后缀名>>>:").strip() # txt

# 3.列举目标路径下所有内容的名称
path_list = os.listdir(dir_path)
# print(path_list)  # ['.idea', '01 json模块补充说明.py', '02 作业讲解.py', 'test.py', 'test01.txt', 'test02.txt']

# 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}个')

2.针对json实操 尝试单文件多用户(一行一个)是否可实现>>>:哪个更方便
不要求完成 单纯体会两种思路的难易

import os
import json

base_file_path = os.path.dirname(__file__)
print(base_file_path)  # D:/PycharmProjects/test19

target_file_path = os.path.join(base_file_path, 'newfile')

# print(os.mkdir(target_file_path))

username = input('name>>>:').strip()
password = input('password:').strip()

real_target_file_path = os.path.join(target_file_path,f'{username}.json')
# real_target_file_path = os.path.join(target_file_path,'user,json')

user_dict = {
    'username':username,
    'password':password
}
# with open(real_target_file_path,'a',encoding='utf8') as f:
#
#     json.dump(user_dict,f)
#     f.write("\n")

def file_write(f_path,message):
    try:
        with open(f_path, 'w', encoding='utf8') as f:
            json.dump(message, f)
            return "写成功啦"
    except Exception as e:
        print(e)

file_write(real_target_file_path,user_dict)

3.编程小练习
有一个目录文件下面有一堆文本文件
eg:
db目录
J老师视频合集
R老师视频合集
C老师视频合集
B老师视频合集
文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择
用户选择哪个文件就自动打开该文件并展示内容
涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径

import os
# 1.获取执行文件路径
file_dir = os.path.dirname(__file__)  # D:/PycharmProjects/day20
# 2.拼接存储文本文件的目标路径
data_dir = os.path.join(file_dir,'data')  # D:/PycharmProjects/day20\date
# 3.列举目标路径下所有的内容名称
list_data = os.listdir(data_dir)  # ['B老师视频集合.txt', 'C老师视频集合.txt', 'J老师视频集合.txt', 'R老师视频集合.txt']
# 添加循环让项目更加合理
while True:
    #4.循环打印文件名供用户选择查看
    for num,file_name in enumerate(list_data,start=1):
        """  
        0 B老师视频集合.txt
        1 C老师视频集合.txt
        2 J老师视频集合.txt
        3 R老师视频集合.txt
        为了没关系,步长从1开始
        1 B老师视频集合.txt
        2 C老师视频集合.txt
        3 J老师视频集合.txt
        4 R老师视频集合.txt
        """
        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)  # 2
    # 7.判断数字是否在列表的索引范围内
    if choice_num not in range(1,len(list_data)+1): # range(1,6)
        print("编号不在范围内,请重新输入编号!!!")
        continue
    #8.索引取值获取用户想要查看的文件名称
    target_name= list_data[choice_num-1]  # 0 B老师视频集合.txt
    # 9.拼接文件的据对路径(此时是在执行文件中找不到data下面的文件夹)
    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]             
                    ]      
            用户可以反复添加商品,在购物车中记录数量        
                {'极品木瓜':[个数,单价]}     
            结算购物车      
                获取用户购物车中所有的商品计算总价并结算即可  
                针对添加购物车和结算只有登录的用户才可以执行

代码实现:

import json
import os


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

# 定义一个全局变量存储用户登录相关的信息
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


        # 4.拼接当前用户构成的文件路径,如果已经存在,证明已经注册过,不存在就可以完成用户注册
        user_db_path = os.path.join(db_path, f'{username}.json')  # 拼接当前用户构成的文件路径
        if os.path.exists(user_db_path):  # 判断用户构成的文件路径是否存在
            print("用户已存在,请重新注册")
            continue
        #5.创建用户字典数据并序列化到文件中
        user_dict = {
            "username":username,
            "password":password,
            "balance":15000,
            "shop_car":{}
        }
        #6.序列化
        with open(user_db_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_pate = os.path.join(db_path,f'{username}.json')  # 获取用户名路径
        if not os.path.exists(user_file_pate):  # 判断用户名文件路径是否存在
            print("用户名不存在,请重新输入用户名!!!")
            continue
        #3获取用户名的密码
        password = input("请输入您的密码>>>>:").strip()
        # 4.获取当前用户对应的真实数据
        with open(user_file_pate,'r',encoding='utf8') as f:
            user_real_dict = json.load(f)  # {"username": "kiki", "password": "123", "balance": 15000, "shop_car": {}}
            if not password == user_real_dict.get("password"):
                print("密码错误,请重新输入!!!")
                continue
            # 修改全局字典 记录当前登录用户名
            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_name in enumerate(good_list,start=1):  # 1 []
            print(f"商品编号:{num}|  商品名称:{good_name[0]} |   商品单价:{good_name[1]}")
        # 3.获取用户输入的商品编号
        choice_number = input("请输入您想要购买的商品编号").strip()
        """ 10.添加结束标志,用于保存购物车数据"""
        if choice_number == 'q':
            #11.获取当前登录用户的字典数据
            user_file_path= os.path.join(db_path,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": 15000, "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]
                    print(old_shop_car)
                else:
                    old_shop_car[g_name] = g_list
                    print(old_shop_car)

            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_number.isdigit():
            print("商品编号必须是纯数字!!")
            continue
        choice_number = int(choice_number)
        # 5.判断数字是否超出范围
        if choice_number not in range(1,len(good_list)+1):
            print("超出商品编号内,无法选择,请重新选择")
            continue
        # 6.根据商品编号获取商品信息
        target_good_list = good_list[choice_number-1]  # ['印度飞饼', 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, 22]   如果字典里有键值对,添加字典的键值会替换原来的值
         t = {'印度飞饼':[10, 22]}  
         t['印度飞饼'] = [10, 22]    字典的键存在会替换值
         判断键是否已存在 如果存在则回去自增列表 将第一个数据值数字自增用户输入的数量
         """
        good_name1 = target_good_list[0]
        if good_name1 in temp_shop_car:
            temp_shop_car.get(good_name1)[0] += good_num
        else:
            temp_shop_car[good_name1] = [good_num,target_good_list[1]]
        print(temp_shop_car)


@login_auth
def clear_car():
    #1.拼接当前登录用户文件路径
    user_file_path = os.path.join(db_path,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')  # {"印度飞饼": [2, 22]}
    if not shop_car:
        print('您的购物车没有商品,请前往商品区添加商品')
        return
    current_balance = user_data_dict.get('balance')
    # 4.统计购物车商品总价
    total_money= 0
    for g_list in shop_car.values():  # [2, 22]
        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")}欢迎下次再来')


data_dict = {
    '1':register,
    '2':login,
    '3':add_shop_car,
    '4':clear_car
}

while True:
    print("""
    1.用户注册
    2.用户登录
    3.添加购物车
    4.结算购物车
    """)
    choice_num= input("请输入你想要执行的功能编号>>>:").strip()
    if choice_num in data_dict:
        data_dict.get(choice_num)()
    else:
        print("编号错误")

标签:实战,shop,car,练习,user,file,print,path
From: https://www.cnblogs.com/zhanglanhua/p/16824760.html

相关文章