python学习笔记
今日内容概要
- 作业讲解
- 购物车程序
今日内容详细
作业讲解
1.编写一个统计指定文件类型的脚本工具
输入指定类型的文件后缀
eg:.txt
并给出一个具体路径 之后统计该类型文件在该文件下的个数
ps:简单实现即可 无需优化
import os
# 1.获取指定路径
target_path = input('请输入目录路径:').strip()
# 2.获取目标后缀
target_back = input('请输入目标后缀:').strip()
# 3.获取指定路径下所有的文件名称
db_list = os.listdir(target_path)
# 4.循环获取每一个文件名 然后判断是否以.txt结尾
count = 0
for i in db_list:
if i.endswith(target_back):
count += 1
print(f'目录{target_path}下后缀名为{target_back}的文件数目有:{count}')
2.针对json实操 尝试单文件多用户(一行一个)是否可实现 哪个更方便
import json
d = {'name': 'jason', 'pwd': 123}
with open(r'userinfo.json', 'a', encoding='utf8') as f:
# json.dump(d, f) # 该方法无法实现换行多次写入
res = json.dumps(d)
f.write(res)
f.write('\n')
with open(r'userinfo.json', 'r', encoding='utf8') as f:
for line in f:
new_line = line.strip('\n')
res = json.loads(new_line)
print(res)
ps: 针对json格式数据,单文件单用户更方便一点
3.编程小练习
有一个目录文件下面有一堆文本文件
eg:
db目录
J老师视频合集
R老师视频合集
C老师视频合集
B老师视频合集
文件内容自定义即可 要求循环打印出db目录下所有的文件名称让用户选择
用户选择哪个文件就自动打开该文件并展示内容
涉及到文件路径全部使用代码自动生成 不准直接拷贝当前计算机固定路径
import os
# 1.获取当前执行文件所在的路径
base_dir = os.path.dirname(__file__)
# 2.拼接存储多个文本文件目录的路径
db_dir = os.path.join(base_dir, 'db')
# 3.获取路径下所有的文件名称
file_name_list = os.listdir(db_dir)
# 4.循环打印文件名称,并采用枚举的形式方便用户选择
while True:
for i, j in enumerate(file_name_list, start=1):
print(i, j)
# 5.获取用户想要打开的文件编号
file_num = input('请输入你想打开的文件编号:').strip()
# 6.判断编号是否是纯数字
if not file_num.isdigit():
print('文件编号只能是纯数字')
continue
file_num = int(file_num)
# 7.判断数字是否在合理范围内
if file_num not in range(1, len(file_name_list) + 1):
print('文件编号超出了范围')
continue
# 8.获取目标文件名称
file_name = file_name_list[file_num - 1]
# 9.拼接文件的绝对路径
file_path = os.path.join(db_dir, file_name)
# 10.文件操作简单的读取展示
with open(file_path, 'r', encoding='utf8') as f:
print(f.read())
购物车程序
项目功能
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.空函数 2.功能字典 3.循环
-
购物车功能之注册
1.动态创建db文件夹 2.获取用户数据 3.拼接存储用户数据的文件路径 4.判断文件路径是否存在 5.如果存在则表示用户名已注册 6.如果不存在构建用户字典(诸多键值对) 7.json序列化到文件中
-
购物车功能之登录
1.获取用户数据 2.拼接存储用户数据的文件路径 3.判断文件路径是否存在 4.如果存在则获取文件中用户的真实数据 5.根据真实数据与用户输入的数据比对 6.使用全局大字典记录用户的登录状态(用户名) 7.如果不存在则提示错误信息
-
购物车功能之校验用户身份
1.装饰器模板 2.根据全局大字典是否存储了用户名判断是否可执行被装饰函数
-
购物车功能之添加购物车
1.校验用户身份(装饰器自动完成) 2.循环打印商品数据(枚举) 3.获取用户输入的商品编号 4.针对编号做一些比较小的完善处理(纯数字 范围) 5.根据编号获取对应的商品数据 6.获取用户购买的数量 7.创建一个临时购物车字典存储用户想要购买的商品 8.获取用户真实数据中的购物车 9.判断购物车中是否已经含有商品数据 10.如果有则采用自增的方式 11.如果没有则采用新建键值对的方式 12.将用户数据重新序列化到文件中 """ 1.针对一些数据可以做注释 2.习惯使用打印操作 查看某些关键点 """
-
购物车功能之结算购物车
1.通过登录的用户名获取用户数据 2.获取购物车数据 3.计算购物车中商品的总价 4.判断总价是否小于用户账户余额 5.如果小于或等于则完成扣款并清空购物车 最后重新写入 6.如果大于则提示用户余额不够 并保持购物车数据不变
# 1.前期不熟练的情况下先不要采用软件开发目录规范
# 先编写功能,写完之后再慢慢拆分
# ps:等我们熟练之后,应该上来就拆分
# 2.可以先搭建项目的整体框架,不编写核心逻辑
# 空函数
# 3.注册功能
# 先看注册功能的要求,其他功能先不用看
# 先写注册的主体逻辑
# 之后再考虑用户名是否冲突等补充逻辑
# 4.登录功能
# 直接编写主体功能即可,没有太多复杂的优化操作
# 5.校验用户是否登录装饰器
# 直接写模板
# 然后利用全局字典记录用户状态
# 6.添加购物车(重点掌握)
# 逻辑较为复杂
# 7.结算购物车
# 注意账户余额是否足够即可
# 8.查看购物车数据
# 再开设一个功能函数
# 被装饰器装饰
# 根据登录的用户名拼接用户文件的完整路径
# 反序列化获取用户字典数据并展示出购物车
import json
import os
# 1.先获取执行文件所在的路径
base_dir = os.path.dirname(__file__)
# 2.拼接db文件夹的路径
db_dir = os.path.join(base_dir, 'db')
# 3.判断db路径是否已存在 如果存在则无需创建 不存在则自动创建
if not os.path.exists(db_dir):
os.mkdir(db_dir)
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('username:').strip()
password = input('password:').strip()
confirm_pwd = input('confirm_pwd:').strip() # 密码的二次确认
# 2.先判断两次密码是否一致
if not password == confirm_pwd:
print('两次密码不一致')
continue
# 补充校验:用户名是否已存在(思路1:可以使用os.listdir() 思路2:拼接用户文件路径)
# 4.拼接存储用户数据的json文件完整路径
file_path = os.path.join(db_dir, '%s.json' % username) # ...db/jason.json
if os.path.exists(file_path):
print('用户名已存在')
continue
# 3.构建临时的用户字典数据
temp_user_dict = {
'name': username,
'pwd': password,
'balance': 15000,
'shop_car': {}
}
# 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('username:').strip()
password = input('password:').strip()
# 2.拼接当前用户文件
file_path = os.path.join(db_dir, '%s.json' % username)
# 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)
# 5.判断用户的密码是否一致
if password == user_dict.get('pwd'):
# 保存登录用户的用户名(登录状态)
is_login['username'] = user_dict.get('name')
print('登录成功')
return
else:
print('密码错误')
@login_auth
def add_shop_car():
# 1.获取商品数据(直接编写)
good_list = [
['挂壁面', 3],
['印度飞饼', 22],
['极品木瓜', 666],
['土耳其土豆', 999],
['伊拉克拌面', 1000],
['董卓戏张飞公仔', 2000],
['仿真玩偶', 10000]
]
# 定义一个临时存储用户想要购买商品的字典数据 {'印度飞饼':[10, 22], '仿真玩偶':[1, 10000]}
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('请输入想要购买的商品编号:').strip()
# 添加一个结束添加购物车的标识 一旦用户输入q则将用户临时购物车字典添加到用户json数据中
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": {}}
# user_dict['shop_car'] = temp_shop_dict # "shop_car": {'印度飞饼':[10, 22],'土耳其土豆':[20, 999]}
# 先获取用户原有的购物车数据
old_shop_car = user_dict.get('shop_car') # {'印度飞饼':[10, 22],'土耳其土豆':[20, 999]}
# 当前用户购物车数据 {'挂壁面': [300, 3], '土耳其土豆': [100, 999], '董卓戏张飞公仔': [200, 2000]}
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, ensure_ascii=False)
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]
target_good_name = target_good_info[0]
target_good_price = target_good_info[1]
# 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:
# 9.获取值列表 然后自增
value_list = temp_shop_dict.get(target_good_name) # [5, 22]
value_list[0] += target_good_num # [5+5, 22]
temp_shop_dict[target_good_name] = value_list
else:
temp_shop_dict[target_good_name] = [target_good_num, target_good_price]
@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) # {'name': 'jason', 'pwd': '123', 'balance': 15000, 'shop_car': {'挂壁面': [100, 3], '土耳其土豆': [50, 999], '印度飞饼': [33, 22]}}
# 3.获取购物车商品数据
shop_car = user_dict.get('shop_car') # {'挂壁面': [100, 3], '土耳其土豆': [50, 999], '印度飞饼': [33, 22]}
if not shop_car:
print('购物车无商品')
return
# 4.计算商品总价
total_money = 0
current_balance = user_dict.get('balance')
for values in shop_car.values(): # [100, 3] [50, 999]
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
@login_auth
def check_shop_car():
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)
shop_car_info = user_dict.get('shop_car') # {'飞饼':[11, 22]}
if not shop_car_info:
print('你什么都没买 看的屁啊!!!')
for item in shop_car_info.items(): # ('挂壁面', [100, 3])
print(f"商品名称:{item[0]} | 商品数量:{item[1][0]} | 商品单价:{item[1][1]}")
func_dic = {
'1': register,
'2': login,
'3': add_shop_car,
'4': buy_shop_car,
'5': check_shop_car,
}
while True:
print("""
1.用户注册
2.用户登录
3.添加购物车
4.结算购物车
5.查看购物车
""")
choice = input('请输入想要执行的功能编号:').strip()
if choice in func_dic:
func_dic.get(choice)()
else:
print('功能编号不存在')
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了