主要还是参考网上内容,自己做了修改。虽然代码有小bug,但是不影响学习和测试。
功能:
1.额度:8000
2.可以提现,手续费5%
3.每月最后一天出账单,写入文件
4.记录每月日常消费流水
5.提供还款接口
1.atm的脚本
[root@python atm]# cat atm.py#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Date:2017-03-23
Author:Bob
'''import os
import time
import pickle
import readline #解决退格键和上下键引起的乱码,需要安装readline和readline-devel包#定义账单,商品和购物车
Bill = {}
products = {}
shoplist = []#define Bill function, used to record billing details(account/time/describe/money).
def Bill(Account,Time,Description,RMB):Bill = {"Account":Account,"Time":Time,"Description":Description,"RMB":RMB}#用pickle模块把账单信息存入到bill文件中去pickle.dump(Bill,open("bill","a"))#购物功能
def shop():print '\033[;32mWelcome to shopping!\n\033[0m'with open('shops.txt') as f:for line in f.readlines():print '{}'.format(line.strip())while 1:with open('shops.txt') as f:for line in f.readlines():line = line.strip()commodity = line.split()[0]price = line.split()[1]products[commodity] = pricechoice = raw_input("\n\033[;36mPlease enter what you want to buy,if you want back,you can enter\033[0m \033[;31mback\033[0m:").strip()if len(choice) == 0:continueelif choice == 'back':list()#如果有这个商品,就判断商品价格,如果商品价格大于余额,就提示余额不足if products.has_key(choice):#从userinfo文件中读取并反序列化remaining = pickle.load(open('userinfo','rb'))if int(products[choice]) > remaining[accountAuth][2]:print 'In your card remaining sum already insufficiency, please prompt sufficient value!'else:while 1:#把购买的商品追加到购物车shoplist.append(choice)#计算余额,余额就是总金额减去购买的商品价格new_remaining = int(remaining[accountAuth][2]) - int(products[choice])userInfo[accountAuth][2] = int(new_remaining)#把余额信息序列化并存到userinfo文件中pickle.dump(userInfo,open("userinfo","wb"))#把购买的记录和账单写到Bill文件中Bill(accountAuth,time.strftime("%Y-%m-%d %H:%M:%S"),choice,"-%d" % int(products[choice]))#打印消费的金额和剩余金额print "\033[;32mConsumption is %r Money is %r\033[0m" % (products[choice],new_remaining)#打印购物车的商品print "\033[;33mThe shopping list %s \033[0m" % shoplistbreakelse:print 'You choose {} is not in the shoplist!'.format(choice)shop()#查询余额功能
def query_money():userInfo = pickle.load(open('userinfo','rb'))totalmoney = userInfo[accountAuth][1]remaining = userInfo[accountAuth][2]print 'Your total money is {}, remaining money is \033[1;31m{}\033[0m!'.format(totalmoney, remaining)#存钱功能
def save_money():while 1:save_desc = raw_input("Please describe save money the details:").strip()if len(save_desc) == 0:continuetry:save_money = int(raw_input("Please save the money:"))except ValueError:print "\033[;31mYou entered must be number.\033[0m"save_money()if save_money % 100 != 0:print 'You must enter an integer of 100!'continueuserInfo = pickle.load(open('userinfo', 'rb'))remaining = int(userInfo[accountAuth][2]) + save_moneyuserInfo[accountAuth][2] = remainingpickle.dump(userInfo, open('userinfo', 'wb'))print 'Your total money is %s, your remaining is \033[;31m%s\033[0m!' %(userInfo[accountAuth][1], userInfo[accountAuth][2])Bill(accountAuth,time.strftime("%Y-%m-%d %H:%M:%S"),save_desc,"+%d" % float(save_money))next = raw_input("1.continue \n2.return \n3.exit \nPlease select: ").strip()if next == '1':continueelif next == '2':list()elif next == '3':exit()else:print 'Please enter the correct content!'#取钱功能
def draw_money():while 1:draw_desc = raw_input("Please describe draw money the details:").strip()if len(draw_desc) == 0:continuetry:draw_money = int(raw_input("Please draw the money:"))except ValueError:print "\033[;31mYou entered must be number.\033[0m"draw_money()if draw_money % 100 != 0:print 'You must enter an integer of 100!'continueuserInfo = pickle.load(open('userinfo', 'rb'))#There are bugs here!if draw_money > int(userInfo[accountAuth][2]):print '\033[;31mYour remaining is insufficient!\033[0m'list()userInfo = pickle.load(open('userinfo', 'rb'))remaining = int(userInfo[accountAuth][2]) - draw_money - draw_money * 0.05userInfo[accountAuth][2] = remainingpickle.dump(userInfo, open('userinfo', 'wb'))print 'Your total money is %s, your remaining is \033[;31m%s\033[0m!' %(userInfo[accountAuth][1], userInfo[accountAuth][2])Bill(accountAuth,time.strftime("%Y-%m-%d %H:%M:%S"),draw_desc,"+%d" % float(draw_money))next = raw_input("1.continue \n2.return \n3.exit \nPlease select: ").strip()if next == '1':continueelif next == '2':list()elif next == '3':exit()else:print 'Please enter the correct content!'#转账功能,和上面的逻辑基本一样
def transfer_money():while 1:userInfo = pickle.load(open('userinfo', 'rb'))transfer_desc = raw_input("Please describe transfer money: ").strip()if len(transfer_desc) == 0:continued_account = raw_input("Please input transfer account: ").strip()if len(d_account) == 0:continueif userInfo.has_key(d_account) is False:print "\033[;31mThis account does not exist\033[0m"transfer_money()d_money = int(raw_input("Please input transfer amount money: "))if d_money % 100 != 0:print "\033[;31mDeposit amount must be 100 integer times\033[0m"continueif d_money > int(userInfo[accountAuth][2]):print "\033[;31mYour balance is insufficient\033[0m"continueuserInfo[accountAuth][2] = int(userInfo[accountAuth][2]) - d_money - d_money * 0.10userInfo[d_account][2] = int(userInfo[d_account][2]) + d_moneypickle.dump(userInfo,open('userinfo', 'wb'))print "\033[;32mYour credit is %r,Your balance is %r\033[0m" % (userInfo[accountAuth][1],userInfo[accountAuth][2])Bill(accountAuth,time.strftime("%Y-%m-%d %H:%M:%S"),transfer_desc,"-%d" % (userInfo[accountAuth][2] - d_money - d_money * 0.10))next = raw_input("1.continue \n2.return \n3.exit \nPlease select: ").strip()if next == '1':continueelif next == '2':list()elif next == '3':exit()else:print 'Please enter the correct content!'#账单功能
def query_bill():Income = []Spending = []num = 0print "Account\t\tTime\t\tDescription\t\t RMB"with open('bill', 'rb') as f:while True:try:line = pickle.load(f)if line["Account"] == accountAuth:if '+' in line["RMB"]:print "\033[;33m%r\t%r\t%r\t\t\t%r\033[0m" % (line["Account"],line["Time"],line["Description"],line["RMB"])income = line["RMB"].strip("+")Income.append(income)else:print "%r\t%r\t%r\t\t\t%r" % (line["Account"],line["Time"],line["Description"],line["RMB"])spending = line["RMB"].strip("-")Spending.append(spending)except:breakfor i in Income:num = num + int(i)income = numprint "Income is %r" % numfor i in Spending:num = num + int(i)spending = numprint "Spending is %r" % numprint "Total is %r" % (int(income) + int(spending))#修改密码功能
def modify_passwd():userInfo = pickle.load(open('userinfo', 'rb')) old_passwd = raw_input("Please enter old password:").strip()while 1:if old_passwd == userInfo[accountAuth][0]:new_passwd = raw_input("Please enter new password:").strip()if len(new_passwd) < 6:print 'Your password is too simple!'continueconfirm_new_password = raw_input("Please confirm new password again:").strip()if new_passwd != confirm_new_password:print 'Two passwords do not match!'else:userInfo[accountAuth][0] = confirm_new_passwordpickle.dump(userInfo, open('userinfo', 'wb'))print '\033[;32mYour password is changed successful!\033[0m'exit()else:print 'Your password is error!'modify_passwd()#ATM机所有功能
def list():print '''\033[;32m
###################################################
# welcome to ATM! #
# #
# 1.shop 2.query money #
# 3.save money 4.draw money #
# 5.transfer money 6.query bill #
# 7.modify password 8.exit #
# #
###################################################
\033[0m'''while 1:choice = raw_input("Please choose according to your needs:").strip()if len(choice) == 0:continueelif choice == '1':shop()elif choice == '2':query_money()elif choice == '3':save_money()elif choice == '4':draw_money()elif choice == '5':transfer_money()elif choice == '6':query_bill()elif choice == '7':modify_passwd()else:print "\n\033[;35mYou have been exit the system!\033[0m"exit()#用户登录功能
userInfo = pickle.load(open('userinfo', 'rb'))
while 1:accountAuth = raw_input("Please input user account:").strip()if len(accountAuth) == 0:continueif userInfo.has_key(accountAuth):if 'lock' in userInfo[accountAuth]:print '%s has been locked!' % accountAuthexit()for num in range(3,0,-1):passwdAuth = raw_input("Please input user password:").strip()if len(passwdAuth) == 0:continueif passwdAuth == userInfo[accountAuth][0]:list()else:print "Wrong password, Can try again \033[;31m%r\033[0m itmes" % numcontinueelse:lockaccount = userInfo[accountAuth]lockaccount.append('lock')pickle.dump(userInfo,open('userinfo', 'wb'))print "\033[;31mAccount freeze within 24 hours\033[0m"exit()else:print "\033[;31mWrong account %r,retype\033[0m" % accountAuth
2.商品表
[root@python atm]# cat shops.txt
computer 6000
iphone 5000
mouse 250
keyboard 40
camera 8000
package 500
power 230
3.初始化账号密码
[root@python atm]# cat create_userinfo.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-import pickle
userInfo = {'xtd':['123456','150000','150000'],'bob':['666','8000','8000'],'xdg':['888','3000','3000']}pickle.dump(userInfo,open('userinfo', 'w'))userinfo = open('userinfo', 'r')
while True:try:line = pickle.load(userinfo)print lineexcept:break
[root@python atm]# python create_userinfo.py
{'xdg': ['888', '3000', '3000'], 'bob': ['666', '8000', '8000'], 'xtd': ['123456', '150000', '150000']}
4.显示余额变化
[root@python atm]# cat cat.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-import pickleuserinfo = open('userinfo', 'r')
while True:try:line = pickle.load(userinfo)print lineexcept:break
[root@python atm]# python cat.py
{'xdg': ['888', '3000', '3000'], 'bob': ['666', '8000', 1000], 'xtd': ['123456', '150000', '150000']}
5.使用方法
[root@python atm]# python atm.py
Please input user account:bob
Please input user password:666###################################################
# welcome to ATM! #
# #
# 1.shop 2.query money #
# 3.save money 4.draw money #
# 5.transfer money 6.query bill #
# 7.modify password 8.exit #
# #
###################################################Please choose according to your needs:2
Your total money is 8000, remaining money is 1000!
Please choose according to your needs:
6.流程图
转载于:https://blog.51cto.com/whnba/1909696