1. 程式人生 > >python--ATM取款機_最終完善版

python--ATM取款機_最終完善版

歷時兩個星期來,總算完善ATM取款機系統,讓我學習到python很多知識用法。
專案詳細情況如下:
1、在atm專案目錄下新建以下檔案
這裡寫圖片描述

這裡寫圖片描述

2、程式碼如下(360多行程式碼,想想真的有點辛苦!)

root@kali:~/python/atm# cat atm.py
#!/usr/bin/python
# --*-- coding:utf-8 --*--
import time#引入時間模組
import datetime#引入日期小時
import tab#引入換行、歷史命令操作模組

'''各種全域性變數、與全域性引數'''
tempusercardmoney = []#定義使用者信用卡臨時消費總額度的列表
f9 = open('usercardmoney.txt','r')#只讀開啟使用者消費信用卡總額度檔案 for p in f9.readlines():#讀取使用者消費信用卡總額度檔案中每行內容 tempusercardmoney.append(p)#讀取使用者消費信用卡總額度檔案中每行內容,到使用者信用卡臨時消費總額度的列表,對使用者查詢使用者可用額度有用 #print p f9.close() #print int(tempusercardmoney[0]) inittotalmoney = int(tempusercardmoney[0])#從使用者信用卡臨時消費總額度的列表的第一個元素,把資料變成整形資料,賦值初始總可用額度
shishitotalmoney = []#實時變化的總餘額列表 shishitotalmoney.append(inittotalmoney)#把初始總可用額度值增加到實時消費總額度的列表中 shouxufei = []#總手續費變化列表 jiamoney = []#金錢增加的列表 jianmoney = []#金錢減少的列表 buyshop = []#消費商場購物購買的商品 '''讀取當前系統的時間''' def curtime(): #now = int(time.time()) now = datetime.datetime.now()#獲取當前時間時分秒 otherstyletime = now.strftime('%Y-%m-%d %H:%M:%S'
)#顯示當前時間的時分秒 #print otherstyletime return otherstyletime#返回當前時間的時分秒 '''查詢賬單要求:所有使用者共享一個xiaofeilist.txt檔案,使用者查詢只顯示當前使用者賬單資訊, 還款記錄在日誌中高亮顯示出來,使用者查詢顯示收入、支出和消費總額(此條未實現)''' def searchbill(): gudingedu = 15000#固定總額度 bl_hktotalmoney = gudingedu - shishitotalmoney[-1]#賬單還款總額度等於固定總額度減去實時花費的總額度 bl_min_hktotalmoney = bl_hktotalmoney*0.01#最低還款額度等於賬單還款總額度的百分之一 print '信用卡總額度為15000¥,信用卡可用額度為%d,本期還款總額為%d,本期最低還款額度為%d' %(shishitotalmoney[-1],bl_hktotalmoney,bl_min_hktotalmoney) print '-------------------------------------------------------------------------------' bl_file = open('xiaofeilist.txt','r')#只讀開啟消費清單檔案 for p in bl_file.readlines():#讀取消費清單檔案中每行內容 print p bl_file.close() '''消費商城要求:1、產品及產品價格 2、消費後扣除價格:判斷賬戶餘額是否足夠,將消費記錄寫入xiaofeilist.txt賬單''' def buy():#消費商城 products = []#定義可以購買商品名稱的列表 prices = []#定義可以購買商品價格的列表 xf_money = 0#初始商品的價格 xf_date = []#定義消費購物清單列表 f_shoplist = open('shoplist.txt','r')#只讀方式開啟商城可以購買的商品檔案 for p in f_shoplist.readlines():#每行資料讀取 new_p = p.split()#對商城可以購買的商品檔案中每個元素進行空格分割 products.append(new_p[0])#把每行讀取的元素第一個值賦值給購買商品名稱的列表 prices.append(new_p[1])#把每行讀取的元素第二個值賦值給購買商品價格的列表 print products print prices while True: choice = raw_input('請輸入要購買的產品:')#輸入需要購買的商品名稱 f_choice = choice.strip()#對輸入的商品名稱進行整塊前後空格過濾 #print f_choice if f_choice != 'q':#如果輸入不是字母q,則進入 if f_choice in products:#如果輸入商品名稱在可以購買商品名稱的列表中,則進入 #print products.index(f_choice)#可以購買的商品在可以購買商品名稱的列表中索引編號 xf_money = int(prices[products.index(f_choice)])#利用可以購買的商品在可以購買商品名稱的列表中索引編號,來定位對應的價格,為整形 #print type(xf_money)#列印型別 #print shishitotalmoney[-1]#列印實時變化的且可用的餘額 if xf_money <= shishitotalmoney[-1] and shishitotalmoney[-1] > 0:#輸入的商品價格小於可用餘額,並可用餘額大於0 buyshop.append(f_choice)#把成功購買的商品加入全域性的購物清單中 jianmoney.append(xf_money)#把成功購買的商品價格增加到全域性的減金額的列表中 curtime()#引入當前時間函式,檢視當前交易時間 xf_date.append(curtime())#把當前交易時間增加到消費購物清單列表 xf_date.append(str(f_choice))#把成功購買的商品增加到消費購物清單列表 xf_date.append(str(xf_money))#把成功購買商品價格增加到消費購物清單列表 xf_date.append('0')#把購物手續費0元增加到消費購物清單列表 #print xf_date #print buyshop,jianmoney print '恭喜你購買了%s'% f_choice creditcardmoneyleft()#引入總餘額函式,檢視當前可以餘額,必須放到減金額列表才能實時檢視餘額 f7 = open('xiaofeilist.txt','a+')#使用追加寫入的方式開啟消費清單檔案 f7.write(xf_date[-4])#把交易時間列表中倒數第4個元素寫入消費清單中 f7.write('\t')#把一個tab寫入消費清單中 f7.write('購買:')#寫入‘購買’說明資訊 f7.write(xf_date[-3])#把交易時間列表中倒數第三個元素寫入消費清單中 f7.write('\t') f7.write(xf_date[-2])#把交易時間列表中倒數第二個元素寫入消費清單中 f7.write('\t\t') f7.write(xf_date[-1])#把交易時間列表倒數中第一個元素寫入消費清單中 f7.write('\n') f7.close() else: print '餘額不足!請存入足夠的金額進行購買!按q鍵退出購物!' else: print '你購買的商品,商鋪清單沒有!請選擇商鋪存在的物品!' else: print '你購買的清單如下:' print buyshop break#退出該函式模組 '''存款要求:額度不能低於100,額度不能高於2000,必須為100的整數倍, 存款金額只能為數字為字母時會提示,將該筆寫入xiaofeilist.txt賬單''' def deposit():#存款 ck_totalmoney = 0#初始存款的總金額 ck_shouxufei = 0#初始存款的手續費金額 ck_date = []#定義交易時間列表 while True: ck_money = int(raw_input('額度不低於100,不高於2000,必須為100整數倍,請輸入你要存款的金額:'))#輸入存款金額 if ck_money%100 == 0:#存款金額為100的整數倍 if ck_money > 99 and ck_money < 2001:#存款金額不低於100,不高於2000 curtime()#引入當前時間函式,計算當前存款的時間 ck_date.append(curtime())#把當前時間值加入交易時間列表中 ck_date.append(str(ck_money))#把當前輸入的存款金額轉換成字元存入交易時間列表中 ck_date.append(str(ck_shouxufei))#把當前輸入存款的手續費金額轉換成字元存入交易時間列表中 print '你存入的金額為%d' % ck_money jiamoney.append(ck_money)#把存款金額加入金錢增加的列表 creditcardmoneyleft()#引入總餘額函式,檢視當前可以餘額,必須放到加金額列表才能實時檢視餘額 f6 = open('xiaofeilist.txt','a+')#使用追加寫入的方式開啟消費清單檔案 f6.write(ck_date[0])#把交易時間列表中第一個元素寫入消費清單中 f6.write('\t')#把一個tab寫入消費清單中 f6.write('存款')#寫入‘存款’說明資訊 f6.write('\t\t') f6.write(ck_date[1])#把交易時間列表中第二個元素寫入消費清單中 f6.write('\t\t') f6.write(ck_date[2])#把交易時間列表中第三個元素寫入消費清單中 f6.write('\n') f6.close() break#退出該函式模組 else: print '你輸入的存款金額不能低於100元,不能高於2000元!' else: print '輸入的存款金額不為100的整數倍,請輸入100整數倍!' '''取款要求:額度不能低於100,額度不能高於2000,必須為100的整數倍,扣除% 5的手續費, 取現額度不能超過餘額,取款金額只能為數字為字母時會提示,將該筆記錄寫入xiaofeilist.txt賬單''' def withdraw():#取款 qk_totalmoney = 0#初始取款的總金額 qu_shouxufei = 0#初始取款的手續費 qk_date = []#定義交易時間列表 while True: qk_money = int(raw_input('取款金額不低於100元,不高於2000元,為100整數倍,請輸入取款金額:'))#輸入取款金額 if qk_money < shishitotalmoney[-1] and shishitotalmoney[-1] > 0 and qk_money > 0:#取款金額小於總可用餘額,總可用餘額大於0,取款金額大於0 print shishitotalmoney[-1] if qk_money%100 == 0:#取款金額為100的整數倍 if qk_money > 99 and qk_money < 2001:#取款金額不低於100,不高於2000 qk_shouxufei = qk_money * 0.05#計算取款手續費 qk_totalmoney = qk_money + qk_shouxufei#取款總金額 curtime()#引入當前時間函式 qk_date.append(curtime())#把當前時間值加入交易時間列表中 qk_date.append(str(qk_totalmoney))#把當前輸入的取款金額轉換成字元存入交易時間列表中 qk_date.append(str(qk_shouxufei))#把當前輸入取款的手續費金額轉換成字元存入交易時間列表中 jianmoney.append(qk_money)#把取款金額加入金錢減少的列表 shouxufei.append(qk_shouxufei)#把手續費金額加入金錢減少的列表 #print qk_date[1],qk_date[2] print '取款實際金額為%d元,手續費為%d元,總取款花費金額為%d元' %(qk_money,qk_shouxufei,qk_totalmoney) creditcardmoneyleft()#引入總餘額函式,檢視當前可以餘額,必須放到減金額列表才能實時檢視餘額 f5 = open('xiaofeilist.txt','a+')#使用追加寫入的方式開啟消費清單檔案 f5.write(qk_date[0])#把交易時間列表中第一個元素寫入消費清單中 f5.write('\t') f5.write('取款') f5.write('\t\t') f5.write(qk_date[1])#把交易時間列表中第二個元素寫入消費清單中 f5.write('\t\t') f5.write(qk_date[2])#把交易時間列表中第三個元素寫入消費清單中 f5.write('\n') f5.close() break#退出該函式模組 else: print '你輸入的取款金額不能低於100元,不能高於2000元!' else: print '輸入的取款金額不為100的整數倍,請輸入100整數倍!' else: print '你輸入的取款金額超過總餘額,請重新輸入大於0的金額!' '''查詢當前賬戶可用餘額''' def creditcardmoneyleft():#查詢當前可用餘額 zhengtotalmoney = 0#初始正符號的總金額 futotalmoney = 0#初始負符號的總金額 jiatotalmoney = []#定義加的總金額的列表 jiantotalmoney = []#定義減的總金額的列表 for p in range(len(shouxufei)):#遍歷手續費列表中所有元素 #print shouxufei[p] jiantotalmoney.append(shouxufei[p])#把手續費的每個元素增加到‘減的總金額列表’中 for m in range(len(jianmoney)):#遍歷減金額列表中所有元素 #print jianmoney[m] jiantotalmoney.append(jianmoney[m])##把減金額的每個元素增加到‘減的總金額列表’中 for n in range(len(jiamoney)):#遍歷加金額列表中所有元素 #print jiamoney[n] jiatotalmoney.append(jiamoney[n])#把加金額的每個元素增加到‘加的總金額列表’中 for i in range(len(jiatotalmoney)):#遍歷加的金額列表中所有元素 #print jiatotalmoney[i] zhengtotalmoney = zhengtotalmoney + jiatotalmoney[i]#計算正符號金額總額 for j in range(len(jiantotalmoney)):#遍歷減的金額列表中所有元素 #print jiantotalmoney[j] futotalmoney = futotalmoney + jiantotalmoney[j]#計算負符號金額總額 totalmoney = inittotalmoney + zhengtotalmoney - futotalmoney#計算總餘額 shishitotalmoney.append(totalmoney)#把實時變化的總餘額增加到shishitotalmoney列表中 f8 = open('usercardmoney.txt','w')#寫入方式開啟使用者消費信用卡總額度檔案 f8.write(str(int(totalmoney)))#總金額變成整形資料,然後變成字元型別寫入使用者消費信用卡總額度檔案 f8.close() print '-------------------------------' print '你的總可用的餘額為% d'% totalmoney print '-------------------------------' '''修改密碼要求:舊密碼驗證後才能提示修改新密碼 新密碼需輸入兩次。兩次相同即可通過 密碼長度必須在6位以上''' def modpassword(): pd_oldtmp = []#定義臨時修改舊密碼列表 pd_old = raw_input('請輸入信用卡的舊的密碼:')#輸入舊密碼 f3 = open('userinfo.txt','r')#只讀開啟使用者資訊檔案 for p in f3.readlines():#每行讀取使用者資訊檔案內容 new_p = p.split()[1]#對使用者資訊檔案中元素使用空格分割,並把第二個元素值賦值給new_p #print new_p pd_oldtmp.append(new_p)#把賦值給new_p的值增加到臨時修改舊密碼列表中 if pd_old == pd_oldtmp[0]:#如果輸入舊密碼與存入臨時修改舊密碼列表中第一個元素值相等,則進入 moduser = []#定義修改使用者列表 modpd = []#定義修改密碼列表 moduserinfo = []#定義修改使用者、密碼列表 f1 = open('userinfo.txt','r')#只讀開啟使用者資訊檔案 #print type(f1) for p in f1.readlines():#每行讀取使用者資訊檔案內容 new_p = p.split()#對使用者資訊檔案中元素使用空格分割,並把每個元素值迴圈賦值給new_p moduser.append(new_p[0])#把取到的第一個元素增加到修改使用者列表中 modpd.append(new_p[1])#把取到的第二個元素增加到修改使用者列表中 f1.close() #print moduser,modpd moduserinfo.append(moduser[0])#把修改使用者的第一個元素值增加到‘修改使用者、密碼列表’中 moduserinfo.append(modpd[0])#把修改密碼的第一個元素值增加到’修改使用者、密碼列表‘中 pd_new1 = raw_input('請輸入新信用卡密碼,至少6位以上:')#第一次輸入的密碼值 pd_new2 = raw_input('請再次輸入新信用卡密碼,至少6位以上:')#第二次輸入的密碼值 if pd_new1 == pd_new2:#如果第一次輸入的密碼值與第二次輸入的密碼值相等,則進入 #print moduserinfo moduserinfo[1] = pd_new1#把第一次輸入的密碼值賦值到‘修改使用者、密碼列表’中第二個元素 #print moduserinfo f1 = open('userinfo.txt','w')#寫入模組開啟使用者資訊檔案 f1.write('')#把使用者資訊檔案所有內容清空 f1.close() f2 = open('userinfo.txt','a+')#追加寫入模式開啟使用者資訊檔案 f2.write(moduserinfo[0])#把修改使用者、密碼列表’中第一個元素使用者寫入使用者資訊檔案中 f2.write('\t') f2.write(moduserinfo[1])#把修改使用者、密碼列表’中第二個元素使用者寫入使用者資訊檔案中 f2.close() print '恭喜您!信用卡密碼修改成功!' else: print '你輸入的兩次新的信用卡密碼不相同!請重新輸入!' else: print '你輸入的信用卡密碼錯誤,請重新輸入!' '''轉賬要求:額度不能低於100元,額度不能高於20000元 必須為100的整數倍,扣除手續費10% 將該筆記錄寫入賬單中''' def tranfer(): tr_totalmoney = 0#初始轉賬總金額 tr_shouxufei = 0#初始轉賬手續費 tr_date = []#定義轉賬交易時間清單列表 while True: tr_money = int(raw_input('轉賬金額不低於100元,不高於2000元,為100整數倍,請輸入轉賬金額:'))#輸入轉賬金額 if tr_money < shishitotalmoney[-1] and shishitotalmoney[-1] > 0 and tr_money > 0:#轉賬金額小於總餘額,總餘額與轉賬金額必須大於0 if tr_money%100 == 0:#轉賬金額為100整數倍 if tr_money > 99 and tr_money < 2001:#轉賬金額大於100,不高於2000 tr_shouxufei = tr_money*0.1#計算轉賬手續費 tr_totalmoney = tr_money + tr_shouxufei#計算轉賬總金額 curtime()#引入當前交易時間函式 tr_date.append(curtime())#增加當前時間到轉賬交易時間清單列表中 tr_date.append(str(tr_totalmoney))#增加轉賬總金額到轉賬交易時間清單列表中 tr_date.append(str(tr_shouxufei))##增加轉賬手續費到轉賬交易時間清單列表中 #print tr_date[1],tr_date[2] jianmoney.append(tr_money)#把轉賬金額增加到加金額列表中 shouxufei.append(tr_shouxufei)#把轉賬手續費增加到手續費列表中 print '轉賬實際金額為%d元,手續費為%d元,總轉賬金額花費為%d元' %(tr_money,tr_shouxufei,tr_totalmoney) creditcardmoneyleft()#引入總餘額函式,檢視當前可以餘額,必須放到減金額列表才能實時檢視餘額 f4 = open('xiaofeilist.txt','a+')#追加寫入方式開啟消費清單檔案 f4.write(tr_date[0])#把轉賬交易時間清單列表中第一個元素寫入消費清單檔案中 f4.write('\t') f4.write('轉賬') f4.write('\t\t') f4.write(tr_date[1])##把轉賬交易時間清單列表中第二個元素寫入消費清單檔案中 f4.write('\t\t') f4.write(tr_date[2])#把轉賬交易時間清單列表中第三個元素寫入消費清單檔案中 f4.write('\n')#換行寫入 f4.close() break#退出該函式模組 else: print '你輸入的轉賬金額不能低於100元,不能高於2000元!' else: print '輸入的轉賬金額不為100的整數倍,請輸入100整數倍!' else: print '你輸入的轉賬金額超過總餘額,請重新輸入大於0的金額!' def gongneng():#選擇的業務功能模組 print '''請選擇操作的業務:(輸入q退出系統) (1) 消費商城購物 (2) 查詢餘額 (3) 存款 (4) 取款 (5) 轉賬 (6) 查詢賬單 (7) 修改密碼''' while True: choice = raw_input('請輸入需要操作業務編號:') f_choice = choice.strip()#除去空格 if f_choice != 'q': if f_choice != ''or f_choice ==1 or f_choice ==2 or f_choice ==3 or f_choice ==4 or f_choice ==6 or f_choice ==7: if f_choice == '1': buy() elif f_choice == '2': creditcardmoneyleft() elif f_choice == '3': deposit() elif f_choice == '4': withdraw() elif f_choice == '5': tranfer() elif f_choice == '6': searchbill() elif f_choice == '7': modpassword() else: continue else: print '你已經退出中國銀行ATM取款系統!歡迎下次光臨!' exit() '''多個賬戶(未實現)/單個賬戶登入驗證,密碼輸入超過三次錯誤凍結帳號30秒''' while True: counttime = 30#初始鎖定時間值 count = 0#初始初始次數 user = []#定義使用者列表 pd = []#定義密碼列表 file = open('userinfo.txt','r+')#只讀開啟使用者資訊檔案 for p in file.readlines():#每行讀取使用者資訊檔案 new_p = p.split()#把每個元素空格分割,並迴圈賦值給new_p user.append(new_p[0])#把new_p取到的第一個元素增加到使用者列表中 pd.append(new_p[1])#把new_p取到的第二個元素增加到使用者列表中 file.close() #print user[0],pd[0] creditcard = raw_input('請輸入信用卡卡號:')#輸入使用者信用卡資訊 #f_creditcard = creditcard.strip() if creditcard == user[0]:#如果輸入使用者信用卡資訊與使用者列表中第一個元素相等,則進入 creditcardpd = pd[0]#把密碼列表中第一個元素賦值給creditcardpd while True: if count != 3:#如果鎖定次數沒有達到3次,則進入 creditcardpassword = raw_input('請輸入信用卡密碼:')#輸入使用者密碼 #f_creditcardpassword = creditcardpassword.strip() if creditcardpassword != creditcardpd:#如果不想等,則進入 count = count + 1#每次迴圈增加1次 print '輸入的密碼不對,還有%d次機會,請重新輸入密碼' % count else: print '恭喜你!歡迎進入中國銀行ATM取款系統!' curtime()#引入當前時間函式 gongneng()#引入業務功能函式 else: print '對不起,你輸入密碼錯誤次數已達到3次,將鎖定30秒!' timeseconds = 0#設定鎖定時間值,鎖定功能,倒計時 while (counttime != timeseconds):#鎖定時間引數不等於設定鎖定時間值,則進入 time.sleep(1)#30秒倒計時 counttime -= 1#每次減少一秒 print counttime break#倒計到0秒退出,跳到使用者輸入信用卡帳號 else: print '輸入的信用卡號%s錯誤!請重新輸入你的信用卡號碼!' % creditcard root@kali:~/python/atm#

程式碼截圖
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

3、執行情況如下

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述