实战练习
作业讲解
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