Python实现atm机的功能

主要还是参考网上内容,自己做了修改。虽然代码有小bug,但是不影响学习和测试。

功能:

1.额度:8000

2.可以提现,手续费5%

3.每月最后一天出账单,写入文件

4.记录每月日常消费流水

5.提供还款接口

1.atm的脚本

[root@python atm]# cat atm.py    #!/usr/bin/env python  # -*- coding: utf-8 -*-  '''  Date:2017-03-23  Author:Bob  '''    import os  import time  import pickle  import readline #解决退格键和上下键引起的乱码,需要安装readline和readline-devel包      #定义账单,商品和购物车  Bill = {}  products = {}  shoplist = []      #define Bill function, used to record billing details(account/time/describe/money).  def Bill(Account,Time,Description,RMB):      Bill = {"Account":Account,"Time":Time,"Description":Description,"RMB":RMB}      #用pickle模块把账单信息存入到bill文件中去      pickle.dump(Bill,open("bill","a"))      #购物功能  def shop():      print '33[;32mWelcome to shopping!n33[0m'      with open('shops.txt') as f:          for line in f.readlines():              print '{}'.format(line.strip())        while 1:          with open('shops.txt') as f:              for line in f.readlines():                  line = line.strip()                  commodity = line.split()[0]                  price = line.split()[1]                  products[commodity] = price                choice = raw_input("n33[;36mPlease enter what you want to buy,if you want back,you can enter33[0m 33[;31mback33[0m:").strip()              if len(choice) == 0:                  continue              elif choice == 'back':                  list()              #如果有这个商品,就判断商品价格,如果商品价格大于余额,就提示余额不足              if products.has_key(choice):                  #从userinfo文件中读取并反序列化                  remaining = pickle.load(open('userinfo','rb'))                  if int(products[choice]) > remaining[accountAuth][2]:                      print 'In your card remaining sum already insufficiency, please prompt sufficient value!'                  else:                      while 1:                          #把购买的商品追加到购物车                          shoplist.append(choice)                          #计算余额,余额就是总金额减去购买的商品价格                          new_remaining = int(remaining[accountAuth][2]) - int(products[choice])                          userInfo[accountAuth][2] = int(new_remaining)                          #把余额信息序列化并存到userinfo文件中                          pickle.dump(userInfo,open("userinfo","wb"))                          #把购买的记录和账单写到Bill文件中                          Bill(accountAuth,time.strftime("%Y-%m-%d %H:%M:%S"),choice,"-%d" % int(products[choice]))                          #打印消费的金额和剩余金额                          print "33[;32mConsumption is %r Money is %r33[0m" % (products[choice],new_remaining)                          #打印购物车的商品                          print "33[;33mThe shopping list %s 33[0m" % shoplist                          break              else:                  print 'You choose {} is not in the shoplist!'.format(choice)                  shop()      #查询余额功能  def query_money():      userInfo = pickle.load(open('userinfo','rb'))      totalmoney = userInfo[accountAuth][1]      remaining = userInfo[accountAuth][2]      print 'Your total money is {}, remaining money is 33[1;31m{}33[0m!'.format(totalmoney, remaining)      #存钱功能  def save_money():      while 1:          save_desc = raw_input("Please describe save money the details:").strip()          if len(save_desc) == 0:              continue          try:              save_money = int(raw_input("Please save the money:"))          except ValueError:              print "33[;31mYou entered must be number.33[0m"              save_money()            if save_money % 100 != 0:              print 'You must enter an integer of 100!'              continue            userInfo = pickle.load(open('userinfo', 'rb'))          remaining = int(userInfo[accountAuth][2]) + save_money          userInfo[accountAuth][2] = remaining          pickle.dump(userInfo, open('userinfo', 'wb'))          print 'Your total money is %s, your remaining is 33[;31m%s33[0m!' %(userInfo[accountAuth][1], userInfo[accountAuth][2])            Bill(accountAuth,time.strftime("%Y-%m-%d %H:%M:%S"),save_desc,"+%d" % float(save_money))            next = raw_input("1.continue n2.return n3.exit nPlease select: ").strip()          if next == '1':              continue          elif next == '2':              list()          elif next == '3':              exit()          else:              print 'Please enter the correct content!'      #取钱功能  def draw_money():      while 1:          draw_desc = raw_input("Please describe draw money the details:").strip()          if len(draw_desc) == 0:              continue          try:              draw_money = int(raw_input("Please draw the money:"))          except ValueError:              print "33[;31mYou entered must be number.33[0m"              draw_money()                if draw_money % 100 != 0:              print 'You must enter an integer of 100!'              continue                 userInfo = pickle.load(open('userinfo', 'rb'))          #There are bugs here!          if draw_money > int(userInfo[accountAuth][2]):              print '33[;31mYour remaining is insufficient!33[0m'              list()            userInfo = pickle.load(open('userinfo', 'rb'))          remaining = int(userInfo[accountAuth][2]) - draw_money - draw_money * 0.05          userInfo[accountAuth][2] = remaining          pickle.dump(userInfo, open('userinfo', 'wb'))          print 'Your total money is %s, your remaining is 33[;31m%s33[0m!' %(userInfo[accountAuth][1], userInfo[accountAuth][2])          Bill(accountAuth,time.strftime("%Y-%m-%d %H:%M:%S"),draw_desc,"+%d" % float(draw_money))          next = raw_input("1.continue n2.return n3.exit nPlease select: ").strip()          if next == '1':              continue          elif next == '2':              list()          elif next == '3':              exit()          else:              print 'Please enter the correct content!'      #转账功能,和上面的逻辑基本一样  def transfer_money():      while 1:          userInfo = pickle.load(open('userinfo', 'rb'))          transfer_desc = raw_input("Please describe transfer money: ").strip()          if len(transfer_desc) == 0:              continue          d_account = raw_input("Please input transfer account: ").strip()          if len(d_account) == 0:              continue          if userInfo.has_key(d_account) is False:              print "33[;31mThis account does not exist33[0m"              transfer_money()          d_money = int(raw_input("Please input transfer amount money: "))          if d_money % 100 != 0:              print "33[;31mDeposit amount must be 100 integer times33[0m"              continue          if d_money > int(userInfo[accountAuth][2]):              print "33[;31mYour balance is insufficient33[0m"              continue          userInfo[accountAuth][2] = int(userInfo[accountAuth][2]) - d_money - d_money * 0.10          userInfo[d_account][2] = int(userInfo[d_account][2]) + d_money          pickle.dump(userInfo,open('userinfo', 'wb'))          print "33[;32mYour credit is %r,Your balance is %r33[0m" % (userInfo[accountAuth][1],userInfo[accountAuth][2])            Bill(accountAuth,time.strftime("%Y-%m-%d %H:%M:%S"),transfer_desc,"-%d" % (userInfo[accountAuth][2] - d_money - d_money * 0.10))            next = raw_input("1.continue n2.return n3.exit nPlease select: ").strip()          if next == '1':              continue          elif next == '2':              list()          elif next == '3':              exit()          else:              print 'Please enter the correct content!'        #账单功能  def query_bill():      Income = []      Spending = []      num = 0      print "AccountttTimettDescriptiontt  RMB"      with open('bill', 'rb') as f:          while True:              try:                  line = pickle.load(f)                  if line["Account"] == accountAuth:                      if '+' in line["RMB"]:                          print "33[;33m%rt%rt%rttt%r33[0m" % (line["Account"],line["Time"],line["Description"],line["RMB"])                          income = line["RMB"].strip("+")                          Income.append(income)                      else:                          print "%rt%rt%rttt%r" % (line["Account"],line["Time"],line["Description"],line["RMB"])                          spending = line["RMB"].strip("-")                          Spending.append(spending)              except:                  break      for i in Income:          num = num + int(i)      income = num      print "Income is %r" % num      for i in Spending:          num = num + int(i)      spending = num      print "Spending is %r" % num      print "Total is %r" % (int(income) + int(spending))        #修改密码功能  def modify_passwd():      userInfo = pickle.load(open('userinfo', 'rb'))       old_passwd = raw_input("Please enter old password:").strip()      while 1:          if old_passwd == userInfo[accountAuth][0]:              new_passwd = raw_input("Please enter new password:").strip()              if len(new_passwd) < 6:                  print 'Your password is too simple!'                  continue              confirm_new_password = raw_input("Please confirm new password again:").strip()              if new_passwd != confirm_new_password:                  print 'Two passwords do not match!'              else:                  userInfo[accountAuth][0] = confirm_new_password                  pickle.dump(userInfo, open('userinfo', 'wb'))                  print '33[;32mYour password is changed successful!33[0m'                  exit()          else:              print 'Your password is error!'              modify_passwd()      #ATM机所有功能  def list():      print '''33[;32m  ###################################################  #            welcome to ATM!                      #  #                                                 #  #    1.shop               2.query money           #  #    3.save money         4.draw money            #  #    5.transfer money     6.query bill            #  #    7.modify password    8.exit                  #  #                                                 #  ###################################################  33[0m'''        while 1:          choice = raw_input("Please choose according to your needs:").strip()          if len(choice) == 0:              continue          elif choice == '1':              shop()          elif choice == '2':              query_money()          elif choice == '3':              save_money()          elif choice == '4':              draw_money()          elif choice == '5':              transfer_money()          elif choice == '6':              query_bill()          elif choice == '7':              modify_passwd()          else:              print "n33[;35mYou have been exit the system!33[0m"              exit()        #用户登录功能  userInfo = pickle.load(open('userinfo', 'rb'))  while 1:      accountAuth = raw_input("Please input user account:").strip()      if len(accountAuth) == 0:          continue      if userInfo.has_key(accountAuth):          if 'lock' in userInfo[accountAuth]:              print '%s has been locked!' % accountAuth              exit()            for num in range(3,0,-1):              passwdAuth = raw_input("Please input user password:").strip()              if len(passwdAuth) == 0:                  continue              if passwdAuth == userInfo[accountAuth][0]:                  list()              else:                  print "Wrong password, Can try again 33[;31m%r33[0m itmes" % num                  continue          else:                  lockaccount = userInfo[accountAuth]                  lockaccount.append('lock')                  pickle.dump(userInfo,open('userinfo', 'wb'))                  print "33[;31mAccount freeze within 24 hours33[0m"                  exit()      else:          print "33[;31mWrong account %r,retype33[0m" % accountAuth

2.商品表

[root@python atm]# cat shops.txt   computer 6000  iphone 5000  mouse 250  keyboard 40  camera 8000  package 500  power 230

3.初始化账号密码

[root@python atm]# cat create_userinfo.py   #!/usr/bin/env python  # -*- coding: utf-8 -*-    import pickle  userInfo = {'xtd':['123456','150000','150000'],              'bob':['666','8000','8000'],              'xdg':['888','3000','3000']              }    pickle.dump(userInfo,open('userinfo', 'w'))    userinfo = open('userinfo', 'r')  while True:      try:          line = pickle.load(userinfo)          print line      except:          break
[root@python atm]# python create_userinfo.py   {'xdg': ['888', '3000', '3000'], 'bob': ['666', '8000', '8000'], 'xtd': ['123456', '150000', '150000']}

4.显示余额变化

[root@python atm]# cat cat.py  #!/usr/bin/env python  # -*- coding: utf-8 -*-    import pickle    userinfo = open('userinfo', 'r')  while True:      try:          line = pickle.load(userinfo)          print line      except:          break
[root@python atm]# python cat.py   {'xdg': ['888', '3000', '3000'], 'bob': ['666', '8000', 1000], 'xtd': ['123456', '150000', '150000']}

5.使用方法

[root@python atm]# python atm.py   Please input user account:bob  Please input user password:666    ###################################################  #            welcome to ATM!                      #  #                                                 #  #    1.shop               2.query money           #  #    3.save money         4.draw money            #  #    5.transfer money     6.query bill            #  #    7.modify password    8.exit                  #  #                                                 #  ###################################################    Please choose according to your needs:2  Your total money is 8000, remaining money is 1000!  Please choose according to your needs:

6.流程图