历时两个星期来,总算完善ATM取款机系统,让我学习到python很多知识用法。

项目详细情况如下:

1、在atm项目目录下新建以下文件

ATM代码 python python atm机_python

ATM代码 python python atm机_ATM代码 python_02

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#

代码截图

ATM代码 python python atm机_atm取款机系统_03

ATM代码 python python atm机_赋值_04

ATM代码 python python atm机_python_05

ATM代码 python python atm机_f5_06

ATM代码 python python atm机_ATM代码 python_07

ATM代码 python python atm机_ATM代码 python_08

ATM代码 python python atm机_f5_09

ATM代码 python python atm机_ATM代码 python_10

ATM代码 python python atm机_f5_11

ATM代码 python python atm机_atm取款机系统_12

3、运行情况如下

ATM代码 python python atm机_f5_13

ATM代码 python python atm机_f5_14

ATM代码 python python atm机_ATM代码 python_15

ATM代码 python python atm机_python_16