用python写的一个自助信用卡的小脚本,有'取现,查询记录,转账,还款,购物'功能,用到了picked序列化,prettytable等功能
下面是测试和代码
root@ubuntu:~# python atm.py plz enter your card id: 0000 plz enter your password: 欢迎登录信用卡系统! 可选操作: 1. 取现: 不能超限额,手续费5% 4. 转账: 可转账到不同用户 2. 查询: 查询余额和交易明细 5. 购物 3. 还款: 现金还款 6. 退出 选择操作: 1 请输入金额: 5000 cash:5000,FEE:250.0 欢迎登录信用卡系统! 可选操作: 1. 取现: 不能超限额,手续费5% 4. 转账: 可转账到不同用户 2. 查询: 查询余额和交易明细 5. 购物 3. 还款: 现金还款 6. 退出 选择操作: 3 请输入金额: 10000 repay 10000 欢迎登录信用卡系统! 可选操作: 1. 取现: 不能超限额,手续费5% 4. 转账: 可转账到不同用户 2. 查询: 查询余额和交易明细 5. 购物 3. 还款: 现金还款 6. 退出 选择操作: 4 请输入对方账号: 0001 请输入金额: 2000 transfer to 0001, 2000RMB 欢迎登录信用卡系统! 可选操作: 1. 取现: 不能超限额,手续费5% 4. 转账: 可转账到不同用户 2. 查询: 查询余额和交易明细 5. 购物 3. 还款: 现金还款 6. 退出 选择操作: 5 商品列表: 1. iphone 标价: 5000RMB 2. MacBook 标价: 12000RMB 3. iMac 标价: 20000RMB 4. car 标价: 50000RMB 5. 退出购物车 输入商品标签: 2 Spend: 12000RMB 商品列表: 1. iphone 标价: 5000RMB 2. MacBook 标价: 12000RMB 3. iMac 标价: 20000RMB 4. car 标价: 50000RMB 5. 退出购物车 输入商品标签: 5 欢迎下次光临! 欢迎登录信用卡系统! 可选操作: 1. 取现: 不能超限额,手续费5% 4. 转账: 可转账到不同用户 2. 查询: 查询余额和交易明细 5. 购物 3. 还款: 现金还款 6. 退出 选择操作: 2 +---------------------+----------+----------------------------+---------+ | datetime | action | log | balance | +---------------------+----------+----------------------------+---------+ | 2015-02-04 15:22:03 | cash | cash:500,FEE:25.0 | 14475.0 | | 2015-02-04 15:22:55 | repay | repay 50000 | 64475.0 | | 2015-02-04 15:23:37 | tramsfer | transfer to 0001, 20000RMB | 44475.0 | | 2015-02-04 15:23:48 | shopping | Spend: 5000RMB | 39475.0 | | 2015-02-04 16:09:45 | cash | cash:5000,FEE:250.0 | 34225.0 | | 2015-02-04 16:10:05 | repay | repay 10000 | 44225.0 | | 2015-02-04 16:10:19 | tramsfer | transfer to 0001, 2000RMB | 42225.0 | | 2015-02-04 16:10:29 | shopping | Spend: 12000RMB | 30225.0 | +---------------------+----------+----------------------------+---------+ 欢迎登录信用卡系统! 可选操作: 1. 取现: 不能超限额,手续费5% 4. 转账: 可转账到不同用户 2. 查询: 查询余额和交易明细 5. 购物 3. 还款: 现金还款 6. 退出 选择操作: 6 Welcome to again!
# coding: utf-8 import pickle import time from prettytable import PrettyTable def userInfo(): # 读取文件,生成用户字典 userDict = {} with open('user_info.txt', 'r') as f: for line in f.xreadlines(): Id, pwd, status = line.split('|') userDict[Id] = [pwd, status] return userDict def login(card_id): # 用户登录认证 import getpass if card_id in userDict and userDict[card_id][1] != '1': for i in xrange(3): p = getpass.getpass('plz enter your password: ') if userDict[card_id][0] == p: return 1 else: print 'password error.' else: print 'id locked!' userDict[card_id][1] = '1' else: print 'no card id or id locked.' def operat(card_id): # 功能菜单 tag = True while tag: print u''' 欢迎登录信用卡系统! 可选操作: 1. 取现: 不能超限额,手续费5% 4. 转账: 可转账到不同用户 2. 查询: 查询余额和交易明细 5. 购物 3. 还款: 现金还款 6. 退出 ''' choose = raw_input('选择操作: ') if choose == '1': cash(card_id) elif choose == '2': showLog(card_id) elif choose == '3': repay(card_id) elif choose == '4': transfer(card_id) elif choose == '5': shopping(card_id) elif choose == '6': tag = False print 'Welcome to again!' else: print u'请输入正确的选项' def getBalance(card_id): # 获取用余额 try: id_info = pickle.load(open('idInfo', 'rb')) except Exception: id_info = {card_id: [float(15000)]} pickle.dump(id_info, open('idInfo', 'wb')) return id_info[card_id][0] else: if card_id in id_info: return id_info[card_id][0] else: id_info[card_id] = [float(15000)] pickle.dump(id_info, open('idInfo', 'wb')) return id_info[card_id][0] def insertBal(card_id, num): # 插入用户余额 id_info = pickle.load(open('idInfo', 'rb')) id_info[card_id] = [float(num)] pickle.dump(id_info, open('idInfo', 'wb')) def repay(card_id): # 还款 num = raw_input('请输入金额: ') if len(num) != 0 and num.isdigit() and float(num) > 0: re_num = getBalance(card_id) + float(num) insertBal(card_id, float(re_num)) log = 'repay %s' % num print log nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) genLog(card_id, 'repay', nowtime, getBalance(card_id), log) else: print u'请输入正确的金额' def cash(card_id): # 取现 bal = getBalance(card_id) money = raw_input('请输入金额: ') if money.isdigit() and len(money) != 0 and float(money) + float(money) * 0.05 < bal: num = bal - (float(money) + float(money) * 0.05) insertBal(card_id, num) log = 'cash:%s,FEE:%s' % (money, float(money) * 0.05) print log nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) genLog(card_id, 'cash', nowtime, str(num), log) else: print u'余额不足或输入错误!' def genLog(card_id, action, date, balance, description): # 生成日志文件,用了picke msg = [date, action, description, str(balance)] try: log_info = pickle.load(open('logInfo', 'rb')) except Exception: log_info = {card_id: [msg]} pickle.dump(log_info, open('logInfo', 'wb')) else: if card_id in log_info: log_info[card_id].append(msg) pickle.dump(log_info, open('logInfo', 'wb')) else: log_info[card_id] = [msg] pickle.dump(log_info, open('logInfo', 'wb')) def showLog(card_id): # 输入日志 try: log_info = pickle.load(open('logInfo', 'rb')) except: print u'之前没有过任何操作' else: x = PrettyTable(['datetime', 'action', 'log', 'balance']) for i in log_info[card_id]: x.add_row(i) print x def transfer(card_id): # 转账功能 des_id = raw_input('请输入对方账号: ') if len(des_id) == 4 and des_id.isdigit() and des_id in userDict and des_id != card_id: money = raw_input('请输入金额: ') sor_bal = getBalance(card_id) if len(money) != 0 and money.isdigit() and 0 < float(money) < sor_bal: nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) des_bal = getBalance(des_id) des_bal += float(money) log = '%s transfer to you %s RMB.' % (card_id, money) genLog(des_id, 'transfer', nowtime, des_bal, log) insertBal(des_id, des_bal) sor_bal -= float(money) insertBal(card_id, sor_bal) log = 'transfer to %s, %sRMB' % (des_id, money) genLog(card_id, 'tramsfer', nowtime, sor_bal, log) print log else: print u'输入错误或余额不足' else: print u'输入错误或账号不存在' def shopping(card_id): # 购物功能 tag = True while tag: print u''' 商品列表: 1. iphone 标价: 5000RMB 2. MacBook 标价: 12000RMB 3. iMac 标价: 20000RMB 4. car 标价: 50000RMB 5. 退出购物车 ''' choose = raw_input('输入商品标签: ') bal = getBalance(card_id) nowtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) if choose == '1': if bal > 5000: log = 'Spend: 5000RMB' print log bal -= 5000 insertBal(card_id, float(bal)) genLog(card_id, 'shopping', nowtime, getBalance(card_id), log) else: print u'余额不足' elif choose == '2': if bal > 12000: log = 'Spend: 12000RMB' print log bal -= 12000 insertBal(card_id, float(bal)) genLog(card_id, 'shopping', nowtime, getBalance(card_id), log) else: print u'余额不足' elif choose == '3': if bal > 20000: log = 'Spend: 20000RMB' print log bal -= 20000 insertBal(card_id, float(bal)) genLog(card_id, 'shopping', nowtime, getBalance(card_id), log) else: print u'余额不足' elif choose == '4': if bal > 50000: log = 'Spend: 50000RMB' print log bal -= 50000 insertBal(card_id, float(bal)) genLog(card_id, 'shopping', nowtime, getBalance(card_id), log) else: print u'余额不足' elif choose == '5': tag = False print u'欢迎下次光临!' else: print u'请输入正确的选项' if __name__ == '__main__': userDict = userInfo() cardId = raw_input('plz enter your card id: ').strip() if login(cardId): operat(cardId)