python--ATM取款機_最終完善版
阿新 • • 發佈:2019-01-02
歷時兩個星期來,總算完善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、執行情況如下