Python 购物车
购物车需求
- 可购买的商品信息显示
- 显示购物车内的商品信息、数量
- 购物车内的商品数量进行增加、减少
- 用户余额的充值
- 用户购买完成进行结账,将最终余额回写到用户文件中
流程图

代码
1、主文件
import sys
import os
import yaml
from prettytable import PrettyTable
def login():
global name
lock = "lock.txt"
loginfile = "password.txt"
login_info = 0
i = 0
while i < 3 and login_info == 0:
name = input("Please input your name: ")
with open(lock, "r") as f:
for line in f:
if name == line.strip():
sys.exit('\033[32:1m用户 %s 已经被锁定\033[0m' % name)
password = input("Please input password: ")
with open(loginfile, "r") as f:
for line in f:
user_file, pass_file = line.split()
if user_file == name and pass_file == password:
print("Bingo!")
login_info = 1
return name
else:
print("You name or password is error!")
i += 1
else:
if i == 3 and login_info == 0:
f = open(lock, "a")
f.write(name + "\n")
f.close()
print('\033[32:1m用户 %s 已经被锁定\033[0m' % name)
def show_goods():
commodity = "commodity.txt"
x = PrettyTable(["商品名称", "价格", "数量"])
x.align["商品名称"] = "l"
x.align["价格"] = "r"
x.align["数量"] = "r"
x.padding_width = 1
with open(commodity, "r", encoding='utf-8') as f:
for line in f:
name, money, number = line.split()
x.add_row([name, money, number])
print(x)
def show_shopping_cart():
open_shop_cart()
def show_bought_goods():
open_bought()
def show_yue(username):
money = "money.txt"
x = PrettyTable(["用户", "余额"])
x.align["用户"] = "l"
x.align["余额"] = "r"
x.padding_width = 1
with open(money, "r", encoding='utf-8') as f:
for line in f:
name, money = line.split()
if name == username:
x.add_row([name, money])
print(x)
def show_info():
print("*****************************")
print("修改密码,请输入E:")
print("查看购物车,请输入S:")
print("查看已购买商品函数,请输入V:")
print("充值,请输入M:")
print("查询余额,请输入Y:")
print("购买商品,请输入B:")
print("查看商品数量和价格,请输入G:")
print("添加商品到购物车,请输入商品名称:")
print("*****************************")
return input("请输入你的选择:")
def recharge(username):
key = username
n = input("请输入充值金额:")
filename = "money.txt"
edit_file_data(filename, username, n, '+')
def add_goods_shopping_cart(key):
n = input("请输入购买数量:")
file1 = "commodity.txt"
file2 = "shop-cart.txt"
ret = edit_file_data(file1, key, n, '-')
if int(ret) == 1:
print("*****************************")
print("商品数量不足,请重新选择")
return
else:
edit_file_data(file2, key, n, '+')
def goods_bought(username):
while True:
show_shopping_cart()
q = input("输入q返回上级菜单,输入其他键继续:")
if q.lower() == 'q':
return
key = input("请输入购买商品名称:")
n = input("请输入购买数量:")
file1 = "money.txt"
file2 = "shop-cart.txt"
file3 = "bought.txt"
with open("commodity.txt", "r", encoding='utf-8') as f1:
for line in f1:
shop = line.split()
if str(shop[0]) == str(key):
value = shop[2]
sum_value = int(n) * int(value)
with open(file1, "r", encoding='utf-8') as f1:
for line in f1:
shop = line.split()
if str(shop[0]) == str(username):
value = shop[1]
if int(sum_value) > int(value):
print("*****************************")
print("余额不足请充值:")
print("*****************************")
return recharge(username)
ret = edit_file_data(file2, key, n, '-')
if int(ret) == 1:
print("*****************************")
print("购物车中没有这么多商品,请重新选择")
print("*****************************")
continue
else:
edit_file_data(file1, username, sum_value, '-')
edit_file_data(file3, key, n, '+')
def edit_password(username):
passwd1 = input("请输入你的新密码:")
passwd2 = input("请再次确认你的密码:")
if passwd1 != passwd2:
print("*****************************")
print("你2次输入的密码不一致,请重新输入")
print("*****************************")
return edit_password(username)
else:
file1 = "password.txt"
file2 = "tmp.txt"
with open(file1, "r", encoding='utf-8') as f1:
with open(file2, "w", encoding='utf-8') as f2:
for line in f1:
shop = line.split()
if str(shop[0]) == str(username):
shop[1] = str(passwd1)
dat_out = " ".join(shop)
f2.write(dat_out + "\n")
else:
dat_out = " ".join(shop)
f2.write(dat_out + "\n")
move_filename(file1)
print("*****************************")
print("密码修改成功!")
def open_shop_cart():
x = PrettyTable(["商品名称", "数量"])
x.align["商品名称"] = "l"
x.align["数量"] = "r"
x.padding_width = 1
with open("shop-cart.txt", "r", encoding='utf-8') as f:
for line in f:
name, number = line.split()
x.add_row([name, number])
print("*****************************")
print(x)
def open_commodity():
x = PrettyTable(["商品名称", "价格", "数量"])
x.align["商品名称"] = "l"
x.align["价格"] = "r"
x.align["数量"] = "r"
x.padding_width = 1
with open("commodity.txt", "r", encoding='utf-8') as f:
for line in f:
name, money, number = line.split()
x.add_row([name, money, number])
print(x)
def open_bought():
x = PrettyTable(["商品名称", "数量"])
x.align["商品名称"] = "l"
x.align["数量"] = "r"
x.padding_width = 1
with open("bought.txt", "r", encoding='utf-8') as f:
for line in f:
name, number = line.split()
x.add_row([name, number])
print(x)
def move_filename(filename):
for file in os.listdir('.'):
if file == filename:
os.remove(file)
for file in os.listdir('.'):
if file == "tmp.txt":
new_name = filename
os.rename(file, new_name)
return
def edit_file_data(filename, key, n, operator):
file2 = "tmp.txt"
sign = 0
if operator == '+':
with open(filename, "r", encoding='utf-8') as f1:
with open(file2, "w", encoding='utf-8') as f2:
for line in f1:
shop = line.split()
if str(shop[0]) == str(key):
sign = 1
shop[1] = str(int(shop[1]) + int(n))
dat_out = " ".join(shop)
f2.write(dat_out + "\n")
else:
dat_out = " ".join(shop)
f2.write(dat_out + "\n")
if sign == 0:
shop = [key, str(n)]
dat_out = " ".join(shop)
f2.write(dat_out + "\n")
elif operator == '-':
with open(filename, "r", encoding='utf-8') as f1:
with open(file2, "w", encoding='utf-8') as f2:
for line in f1:
shop = line.split()
if str(shop[0]) == str(key):
if int(shop[1]) < int(n):
return 1
else:
shop[1] = str(int(shop[1]) - int(n))
dat_out = " ".join(shop)
f2.write(dat_out + "\n")
else:
dat_out = " ".join(shop)
f2.write(dat_out + "\n")
move_filename(filename)
return 0
def main():
username = login()
show_goods()
while True:
key = show_info()
print("*****************************")
if key.lower() == 's':
show_shopping_cart()
elif key.lower() == 'e':
edit_password(username)
elif key.lower() == 'v':
show_bought_goods()
elif key.lower() == 'm':
recharge(username)
elif key.lower() == 'y':
show_yue(username)
elif key.lower() == 'b':
goods_bought(username)
elif key.lower() == 'g':
show_goods()
else:
add_goods_shopping_cart(key)
if __name__ == "__main__":
main()
2、用户帐号密码文件
# password.txt
evescn 123456
gmkk 12321
3、用户金额文件
# money.txt
evescn 30
gmkk 200
4、商品文件
# commodity.txt
《Python入门》 5 100
《Python放弃》 12 100
瓜子 89 10
苹果 55 5
西瓜 15 2
葡萄 12 3
西红柿 8 4
5、购物车文件
# shop-cart.txt
瓜子 6
苹果 2
西瓜 3
西红柿 2
6、已购商品文件
# bought.txt
瓜子 1
运行结果
1、修改用户密码测试
Please input your name: evescn
Please input password: 123456
Bingo!
+----------------+------+------+
| 商品名称 | 价格 | 数量 |
+----------------+------+------+
| 《Python入门》 | 5 | 100 |
| 《Python放弃》 | 12 | 100 |
| 瓜子 | 89 | 10 |
| 苹果 | 55 | 5 |
| 西瓜 | 15 | 2 |
| 葡萄 | 12 | 3 |
| 西红柿 | 8 | 4 |
+----------------+------+------+
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:e
*****************************
请输入你的新密码:Gmkk
请再次确认你的密码:gmkk
*****************************
你2次输入的密码不一致,请重新输入
*****************************
请输入你的新密码:gmkk
请再次确认你的密码:gmkk
*****************************
密码修改成功!
*****************************
# password.txt 文件内容
evescn gmkk
gmkk 12321
2、添加商品到购物车测试
《Python入门》 5 100
《Python放弃》 12 100
瓜子 89 10
苹果 55 5
西瓜 15 2
葡萄 12 3
西红柿 8 4
瓜子 6
苹果 2
西瓜 3
西红柿 2
Please input your name: evescn
Please input password: 123456
Bingo!
+----------------+------+------+
| 商品名称 | 价格 | 数量 |
+----------------+------+------+
| 《Python入门》 | 5 | 100 |
| 《Python放弃》 | 12 | 100 |
| 瓜子 | 89 | 10 |
| 苹果 | 55 | 5 |
| 西瓜 | 15 | 2 |
| 葡萄 | 12 | 3 |
| 西红柿 | 8 | 4 |
+----------------+------+------+
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:瓜子
*****************************
请输入购买数量:20
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:
《Python入门》 5 100
《Python放弃》 12 100
瓜子 69 10
苹果 55 5
西瓜 15 2
葡萄 12 3
西红柿 8 4
瓜子 26
苹果 2
西瓜 3
西红柿 2
3、充值测试和显示余额测试
# 充值前 money.txt 文件
evescn 30
gmkk 200
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:m
*****************************
请输入充值金额:200
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:y
*****************************
+--------+------+
| 用户 | 余额 |
+--------+------+
| evescn | 230 |
+--------+------+
*****************************
4、显示购物车
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商��到购物车,请输入商品名称:
*****************************
请输入你的选择:s
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 26 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
*****************************
5、显示已购商品
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:v
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 1 |
+----------+------+
*****************************
6、购买商品
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:b
*****************************
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 26 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:
请输入购买商品名称:瓜子
请输入购买数量:20
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 6 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:
请输入购买商品名称:瓜子
请输入购买数量:5
*****************************
余额不足请充值:
*****************************
请输入充值金额:200
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:b
*****************************
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 6 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:
请输入购买商品名称:瓜子
请输入购买数量:7
*****************************
购物车中没有这么多商品,请重新选择
*****************************
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 6 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:
请输入购买商品名称:瓜子
请输入购买数量:6
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 0 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
输入q返回上级菜单,输入其他键继续:q
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:y
*****************************
+--------+------+
| 用户 | 余额 |
+--------+------+
| evescn | 170 |
+--------+------+
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:s
*****************************
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 0 |
| 苹果 | 2 |
| 西瓜 | 3 |
| 西红柿 | 2 |
+----------+------+
*****************************
修改密码,请输入E:
查看购物车,请输入S:
查看已购买商品函数,请输入V:
充值,请输入M:
查询余额,请输入Y:
购买商品,请输入B:
查看商品数量和价格,请输入G:
添加商品到购物车,请输入商品名称:
*****************************
请输入你的选择:v
*****************************
+----------+------+
| 商品名称 | 数量 |
+----------+------+
| 瓜子 | 27 |
+----------+------+
*****************************
已知的bug问题
- 没有对用户输入的商品进行判断,一旦用户输入的商品不存在,将会报错(添加商品到购物车和购买商品时需要输入商品名称)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
2017-06-21 Linux基础命令-文本文件查看工具
2017-06-21 Linux基础命令-ls