Python文件处理之购物车系统
一、Python文件处理之购物车系统
- 用户名和密码存放于文件中,格式为:nick,nick123
- 加载所有用户名,检查用户名是否已存在
- 启动程序后,先登录,登录成功则让用户输入工资,然后打印商品列表,失败则重新登录,超过三次则退出程序
- 允许用户根据商品编号购买商品
- 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
- 可随时退出,退出时,打印已购买商品和余额
import os
product_list = [
['iphone17', 998],
['Python教程', 9.9],
['su7', 2000],
['byd', 999],
['coke', 1.8],
['锅巴', 20]
]
shopping_cart = {} # 存储用户购物车信息的字典
current_userinfo = [] # 存储当前登录用户的信息
# 原始字符串,避免被转义
db_file = r'D:\db.txt' # 用户数据文件路径
while True:
print('登录\n注册\n购物')
choice = input('>>:').strip()
if choice == '1':
flag = True
count = 0
while flag:
if count == 3:
print('尝试次数过去,退出程序。。。')
break
uname = input('用户名:').strip()
password = input('密码:').strip()
with open(db_file, 'r', encoding='utf-8') as f:
for line in f:
line = line.strip()
user_info = line.split(',')
uname_db = user_info[0]
pwd_db = user_info[1]
balance_db = int(user_info[2])
if uname == uname_db and password == pwd_db:
print('登录成功!')
current_userinfo = [uname_db, balance_db]
print('用户信息:', current_userinfo)
flag = False
break
else:
print('检查用户名或密码错误!')
count += 1
elif choice == '2':
# 步骤1:预先加载所有用户名
existing_users = set()
try:
with open(db_file, 'r', encoding='utf-8') as f:
for line in f:
parts = line.strip().split(',')
if parts: # 确保非空行
existing_users.add(parts[0])
except FileNotFoundError:
# 文件不存在时创建空集合
existing_users = set()
# 步骤2:用户名输入与验证循环
while True:
uname = input('请输入用户名:').strip()
# 检查用户名是否已存在
if uname in existing_users:
print(f"用户名 '{uname}' 已被占用,请选择其他用户名")
else:
break # 唯一用户名,退出循环
while True:
password1 = input('情输入密码:').strip()
password2 = input('情确认密码:').strip()
if password1 == password2:
break
else:
print('两次输入密码不一致,请再次输入!!')
balance = input('请输入充值金额:').strip()
with open(db_file, 'a', encoding='utf-8') as f:
f.write('%s,%s,%s\n' % (uname, password1, balance))
elif choice == '3':
# 登录成功,开始购物
uname_db = current_userinfo[0]
balance_db = current_userinfo[1]
print(f'尊敬的用户{uname_db},您的账户余额为{balance_db}')
flag = True
while flag:
for index, product in enumerate(product_list):
print(index, product)
choice = input('输入商品的编号购物,输入‘q’退出>>:').strip()
if choice.isdigit():
choice = int(choice)
if choice < 0 or choice >= len(product_list):
continue
pname = product_list[choice][0]
pprice = product_list[choice][1]
if balance_db > pprice:
if pname in shopping_cart:
shopping_cart[pname]['count'] += 1
else:
shopping_cart[pname] = {
'pprice': pprice,
'count': 1
}
balance_db -= pprice
current_userinfo[1] = balance_db
print(
"Added product " + pname +
" into shopping cart,your current balance "
+ str(balance_db))
else:
print(f'你太穷了!商品价格是{pprice},你还差{pprice - balance_db}')
print(shopping_cart)
elif choice == 'q':
print("""
---------------------------------已购买商品列表---------------------------------
id 商品 数量 单价 总价
""")
total_cost = 0
for i, key in enumerate(shopping_cart):
print('%22s%18s%18s%18s%18s' %
(i, key, shopping_cart[key]['count'],
shopping_cart[key]['pprice'],
shopping_cart[key]['pprice'] *
shopping_cart[key]['count']))
total_cost += shopping_cart[key]['pprice'] * shopping_cart[key]['count']
print("""
您的总花费为: %s
您的余额为: %s
---------------------------------end---------------------------------
""" % (total_cost, balance_db))
while flag:
inp = input("确认购买(yes/no?)>>:").strip()
if inp not in ['Y', 'N', 'y', 'n', 'yes', 'no']:
continue
if inp in ['Y', 'y', 'yes']:
# 将余额写入文件
src_file = db_file
dst_file = r'%s.swap' % db_file
with open(src_file, 'r', encoding='utf-8') as read_f, \
open(dst_file, 'w', encoding='utf-8') as write_f:
for line in read_f:
if line.startswith(uname_db): # 字符串前缀匹配
l = line.strip('\n').split(',') # 移除行尾换行符,按逗号分割字符串
l[-1] = str(balance_db)
line = ','.join(l) + '\n'
write_f.write(line)
os.remove(src_file)
os.rename(dst_file, src_file)
print('购买成功,耐心等待发货。')
# 重置购物车,清除用户会话,退出购物循环
shopping_cart = {}
current_userinfo = []
flag = False
else:
print("输入形式非法")
elif choice == 'q':
break
else:
print('非法操作')
Python文件处理之购物车系统的更多相关文章
- python实现简单购物车系统(练习)
#!Anaconda/anaconda/python #coding: utf-8 #列表练习,实现简单购物车系统 product_lists = [('iphone',5000), ('comput ...
- ATM系统和购物车系统 不需要文件支撑
目录 ATM系统 购物车系统 ATM系统 #coding=utf8 #Version:python 3.6.4 #Tools:Python 2019.9.7 _data_ = '2019/9/7/01 ...
- 使用MongoDB和JSP实现一个简单的购物车系统
目录 1 问题描述 2 解决方案 2.1 实现功能 2.2 最终运行效果图 2.3 系统功能框架示意图 2.4 有关MongoDB简介及系统环境配置 2.5 核心功能代码讲解 ...
- python文件I/O(转)
Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...
- python 文件操作总结
Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...
- Python基础篇【第2篇】: Python文件操作
Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...
- Python 文件I/O (转)
Python 文件I/O 本章只讲述所有基本的的I/O函数,更多函数请参考Python标准文档. 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你 ...
- Python 文件对象
Python 文件对象 1) 内置函数 open() 用于打开和创建文件对象 open(name,[,mode[,bufsize]]) 文件名.模式.缓冲区参数 mode: r 只读 w 写入 a 附 ...
- python文件和文件夹訪问File and Directory Access
http://blog.csdn.net/pipisorry/article/details/47907589 os.path - Common pathname manipulations 都是和路 ...
- Python文件常用操作方法
Python文件常用操作方法 一.对File对象常用操作方法: file= open(file, mode='r', buffering=-1, encoding=None, errors=None, ...
随机推荐
- JAVA经典算法分析
算法分析是对一个算法需要多少计算时间和存储空间作定量的分析. 算法(Algorithm)是解题的步骤,可以把算法定义成解一确定类问题的任意一种特殊的方法.在计算机科学中,算法要用计算机算法语言描述 ...
- 在 Mac 系统上使用 docker
1.通过 brew 安装 docker client brew install docker 2.通过 brew 安装 colima(开源的轻量级容器,可以在 linux 和 mac 上运行) bre ...
- 洛谷P2024 [NOI2001]食物链 种类并查集
洛谷P2024 [NOI2001]食物链 题目描述 见食物链 - 洛谷 \(n\le5*10^4\) \(k\le10^5\) Recollection 初中的时候想了一个假掉了的算法想了很久. 刚刚 ...
- K8S的API Server认证介绍
一.说明 kube-apiserver是k8s最重要的制组件之一,主要提供以下功能: 提供集群管理的REST API 接口, 包括认证授权.数据校验以及集群状态变更等 k8s 中所有模块与 etcd ...
- 数栈UI5.0设计实战|B端表单这样设计,不仅美观还提效
表单是B端产品中最常见的组件之一,主要⽤于数据收集.校验和提交.比如登陆流程的账号密码填写,注册流程的邮箱.用户名等信息填写,都是表单应用的常见案例,在数栈产品中也是出现频率⾮常⾼的组件. 尽管表单应 ...
- oracle库exp导出dmp文件导入 expdp导出不适用
//创建用户 create user test identified by test; grant connect,resource,dba to test; //cmd 命令执行dmp文件 imp ...
- Windows 界面卡死,黑屏,处理方法
explorer-------打开资源管理器 windows 界面卡死的时候,就是黑屏,或者界面一卡一卡的时候 可以通过Win+R 运行 explorer
- c#基础(视频)
可空类型 类型后面+?就可以声明可空类型了,可空类型和普通的类型是两种类型,赋值时需要进行类型转换 例如 double? num=null: 面向对象 三大特征 封装 打包,便于管理 继承 拿来主义, ...
- 前端开发系列033-基础篇之Event事件
本文介绍JavaScript事件相关的知识点,主要包括事件流.事件处理程序.事件对象(event)以及常见事件类型和事件委托等相关内容. 在网页开发涉及的三种基础技术(HTML \ CSS \ Jav ...
- C++ 临时变量的释放规则
简介 临时变量是在什么时候进行释放的呢? 委员会将注意力集中到"语句结束位置",很自然的,这种选择被通俗地称做 EOS (End Of Statement) .问题是如何精确定义 ...