最近在学习Python,便利用业余时间开发了一个模拟ATM抢银行的小程序,不废话,直接上程序
#!/usr/bin/env python #coding=utf-8 # Name: AtmCard.py __author__ = 'kumikoda' import pickle import sys import time import hashlib import os def main(): '''打印功能信息列表,并提供用户输入接口再进行具体项目操作''' cardNum = login('id') if cardNum == False: sys.exit() while True: wecome = raw_input("""欢迎使用本银行信用卡中心! 请输入如下功能对应的数字. 功能如下: 1. 第一次使用卡,请对卡进行初始化操作(重要). 2. AMT现金取款 3. 购物、消费等刷卡消费 4. 信用卡还款 5. 退出 Please input(1/2/3/4/5):""").split() if len(wecome) == 0: continue number = wecome[0] if number == '1': init() continue elif number == '2': draw_money(cardNum) elif number == '3': buy(cardNum) elif number == '4': repayment(cardNum) elif number == '5': print "Exit, Good Bye!" sys.exit() else: print "你输入的数字不在功能列表内,请重新输入." continue def login(number=None): '''用户登录验证''' with open('F:\Python\Balance_tab','rb') as f: # 读取文件并将数据放入元组 for line in f: keys = line.split()[1] print keys vlues = line.split()[2] print vlues con = 0 while True: CardNum = raw_input("\033[32;1m请输入您的信用卡卡号:") if CardNum == keys: UserPwd = raw_input("\033[32;1m请输入你的登录密码:") md5 = hashlib.md5() md5.update(UserPwd) UserPwd = md5.hexdigest() print md5.hexdigest() if UserPwd == vlues: print "登录成功." if number == "id": return CardNum else: return True else: con = con + 1 print "输入的密码或者用户名有误,请重新输入,[Error %s]" % con if con == 3: print "输入的密码错误三次." return False else: continue else: print "没有找到你输入的卡号,请重新输入." continue def init(): '''新卡初始化(1.额度加载 2.设置修改卡密码 3. 添加记账日志格式头部)''' money = [] with open('F:\Python\Balance_tab','rb') as f: m = f.read().split()[-1] money.append(m) temp_log(Tlist=money, content='dump') print "Temp money load OK." initDlist = ['账号' + '时间' + '\t', '摘要' + '\t', '消费金额' + '\t', '手续费' + '\n'] day_log(initDlist) print "Day log write OK." def draw_money(cardNum): '''取现功能''' while True: input_money = raw_input("欢迎使用本中心自助取款ATM系统,请输入本次取款金额:") if len(input_money.split()) == 0: continue userinfo = raw_input("取现需收取%5的手续费,确认是否取现[Y/n]:") if userinfo == "Y" or userinfo == "y": ## load总金额,并计算输出 t1 = temp_log(content='load') money = float(t1[0]) fee = float(input_money) * 0.05 # 手续费 draw = float(input_money) + fee # 本次取款额+手续费 if draw >= money: print "账户余额不足,请重新输入取款金额." continue else: total = money - draw # 账户余额 - 本次取款额 print "您本次取现金额为: RMB% s 账户可取现总金额为: RMB% s" %(input_money, total) ## dump 消费后总金额,到文件内保存 totals = [] totals.append(total) temp_log(Tlist=totals, content='dump') ## 写入日志文件 drawtime = time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime()) # 获取当前日期 Dlist = [cardNum + '\t', drawtime + '\t', 'draw money' + '\t', '-' + input_money + '\t', '-' + str(fee) + '\n'] day_log(Dlist) scont = raw_input("您是否继续取现:[Y/n]") if scont == "Y" or scont == "y": continue elif scont == "N" or scont == "n": print "Exit!" break elif userinfo == "N" or userinfo == "n": print "Exit!" sys.exit() else: print "你输入[Y/n]按回车键确认:" continue def buy(cardId): '''购物/消费等''' user_Money = int(temp_log(content='load')[0]) while True: list = {1: ['Iphone 6s', '5000'], 2: ['MacBook', '15000'], 3: ['Tea', '550'], 4: ['Vegetables', '450'], 5: ['coffee', '250']} print "购物清单:" for x, y in list.items(): z = ' '.join(y) print x, z yn_list = raw_input("Do you need to buy [Y/n] or add shoping list [S] Enter:") if yn_list == "Y" or yn_list == "y": user_input = raw_input("请输入你要购买的商品名称对应的编号:") k = int(user_input) if len(user_input) == 0: print "你没有输入任何商品的名称,请重新输入." continue amount = int(list[k][1]) # 取字典中key对应的商品价格 if user_Money > amount: user_Money = user_Money - amount print "You need to pay RMB%s totally." % amount print "你的账户余额为: RMB%s" % user_Money ## 消费写入日志文件 drawtime = time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime()) defname = sys._getframe().f_code.co_name Dlist = [cardId + '\t', drawtime + '\t', defname + ':' + list[k][0] + '\t', '-' + str(amount) + '\t', '0' + '\n'] day_log(Dlist) ## 将消费后金额写入temp文件 tmp_Money = [] tmp_Money.append(user_Money) temp_log(Tlist=tmp_Money, content='dump') elif user_Money < amount: print "你的账户余额为: RMB%s" % user_Money print "你的账户余额不足已支付本次购物,你可以尝试选择其他商品!" continue if (user_Money < 100) and (user_Money > 0): print "由于你的账户余额已低于购物清单任何物品单价,系统自动退出购物,请充值后再来购买." sys.exit() elif yn_list == "N" or yn_list == "n": print "You input %s, exit buy!" % yn_list #sys.exit() break elif yn_list == "S" or yn_list == "s": while True: shop_id = raw_input("请输入ID号,注意ID号不能重复:") shop_m = raw_input("请输入商品名称和价格,中间已单个空格.") list[shop_id] = shop_m print "成功添加商品到货架." print list s_input = raw_input("是否继续添加[Y/n]:") if s_input == "Y" or s_input == "y": continue else: print "Exit, 退出商品添加." break else: print "You input Other string, please again!" continue def day_log(Dlist): '''日记账、每月账单导出功能''' with open("log.txt", 'a') as df: df.writelines(Dlist) def temp_log(Tlist=None, content="load"): '''总金额临时记录文件''' try: if content == "load": loadput = open('temp.txt', 'r') loaddata = pickle.load(loadput) loadput.close() return loaddata elif content == "dump": output = open('temp.txt', 'wb') pickle.dump(Tlist, output, protocol=2) output.close() elif content == "loads": data = pickle.loads(Tlist) return data else: print "参数错误,重新输入." except Exception, e: print e def repayment(cardID): '''信用卡还款接口''' try: while True: # 获取初始额度 with open('F:\Python\Balance_tab','rb') as f: s = int(bf.read().split()[-1]) # 截止还款日获取卡内余额 balance = temp_log(content='load')[0] repay = s - balance if repay == 0: print "您本月已还款,无需还款." print "Exit, repayment." break else: print "您本月需要还款金额为: ¥%s" % repay h_input = raw_input("确认是否还款,请输入[Y/n]:") if h_input == "Y" or h_input == "y": amount_in = raw_input("请输入您本次还款金额:") if float(amount_in) > repay: print "您输入的还款额超过本月消费金额,请重新输入." continue else: dumppay = float(amount_in) + balance # dump到temp文件 dpay = [dumppay] temp_log(Tlist=dpay, content='dump') print "还款成功." # 记录到流水日志 paytime = time.strftime("%Y-%m-%d_%H:%M:%S", time.localtime()) repadyLog = [cardID + '\t', paytime + '\t', "repayment" + '\t', '+' + amount_in + '\t', '0' + '\n'] day_log(repadyLog) elif h_input == "N" or h_input == "n": print "Exit, repayment system." break else: print "Please input again." continue except Exception, e: print e if __name__ == '__main__': main()