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, ...
随机推荐
- PostGIS栅格数据类型解析【raster】
PostGIS 栅格数据类型解析:结构.转换与应用 一.栅格数据类型概述 在 PostGIS 中,raster 是用于存储和处理栅格数据的核心类型,支持从多种格式(如 JPEG.GeoTIFF.PNG ...
- java 腾讯云、阿里云SMS短信工具类
引入POM依赖 <!-- 腾讯云SMS SDK --> <dependency> <groupId>com.tencentcloudapi</groupId& ...
- Windows查看连接过的wifi的密码和生成二维码
打开CMD 可按WIN+R打开运行,输入cmd然后回车 查看连接过的wifi列表 输入命令:netsh wlan show profiles 结果: C:\Users\daen>netsh wl ...
- 如何在FastAPI中构建一个既安全又灵活的多层级权限系统?
title: 如何在FastAPI中构建一个既安全又灵活的多层级权限系统? date: 2025/06/14 12:43:05 updated: 2025/06/14 12:43:05 author: ...
- 手把手 Flexbox——从零开始的奶奶级 Web 开发教程3
上一篇讲了盒子模型,今天我们要涉及的主题是 Flexbox. 先来点顾名思义,Flex,折叠:box,盒子.可以折叠的盒子,也称作弹性盒子,就是可以根据可用的空间进行缩放的网页元素. 既然是盒子,那么 ...
- ThreadLocal详解:线程私有变量的正确使用姿势
ThreadLocal详解:线程私有变量的正确使用姿势 在多线程编程中,如何让每个线程都拥有自己独立的变量副本?ThreadLocal就像给每个线程分配了一个专属保险箱,解决了线程间数据冲突的问题.本 ...
- [2024.12.29 鲜花] 你怎么知道海伊出AI声库了
[2024.12.29 鲜花] 你怎么知道海伊出AI声库了 你好,这是咕咕咕了一周的鲜花 感觉日漫真的香啊,好看爱看,就是为什么现代人对于深桎的感情只会用爱情来描写吗,虽然描写的是很感人,但还是想吐槽 ...
- Linux在线安装JDK1.8+
Linux在线安装JDK1.8+(默认已发布最新版) 命令在线下载jdk: wget --no-check-certificate --no-cookies --header "Cookie ...
- Python 潮流周刊#108:AI 会取代初级开发者吗?(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 400+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- SqlServer 查看所有触发器信息的命令
https://blog.csdn.net/chenghaibing2008/article/details/45332993 SELECT object_name(a.parent_ob ...