python模拟ATM系统

一、环境及程序功能说明

python 2.7.12模拟与银行ATM功能,主要功能如下:

1,登录查询余额

2,转账功能

3,提现功能

4,流水查询

5,密码修改

6,还款功能

7,退出(切换账号)

采用pickle存储账号密码相关信息,以账号名为日志文件名存储该账号的流水日志~

为了实现测试,先写一个提供测试文件的小脚本,代码如下:

#coding:utf-8
import pickle
import time
import os
IOSTIME = ‘%Y-%m-%d %X‘
Now = time.strftime(IOSTIME,time.localtime())
Counts = {‘9168‘:[‘1234‘,‘0‘,15000,[Now]],‘9198‘:[‘4567‘,‘0‘,10000,[Now]],‘9999‘:[‘6789‘,‘1‘,12000,[Now]]}
bank_count = open("banks_counts.pkl",‘w‘)
pickle.dump(Counts,bank_count)
os.chdir(".")
for log in Counts.keys():
    os.popen("rm -rf %s" %log)

print("测试数据已经生成:\n:%s" %Counts)

二、ATM系统实现

#!/usr/bin/env python
#coding=utf8
import pickle
import sys
import time
import os
IOSTIME = ‘%Y-%m-%d %X‘
Now = time.strftime(IOSTIME,time.localtime())
reload(sys)
sys.setdefaultencoding(‘utf-8‘)

##现在时间
def NOW():
    global Now
    Now = time.strftime(IOSTIME,time.localtime())
    return Now

##读入数据
with open(‘banks_counts.pkl‘) as bank_infos:
    UserInfos = pickle.load(bank_infos)
    print UserInfos

##完成写入功能
def Write_DB():
    with open(‘banks_counts.pkl‘,‘w‘) as New_bank_infos:
        pickle.dump(UserInfos,New_bank_infos)

#for userinfo in UserInfos.keys():
#    print UserInfos[userinfo]     

##查询金额
def LookHow(HM):
    print "现在时间是: %s,银行余额: %s RMB!" %(NOW(),HM)
#提现功能    
def TakeCrash(HOW,WHO):
    ShouXuFei = HOW * 0.01                    #手续费为1/100
    if (HOW + ShouXuFei) > WHO:
        print "余额不足提取!"
    else:
        WHO = WHO - HOW- ShouXuFei
        print "您要提取的金额为:%s,手续费: %s,余额为:%s RMB!" %(HOW,ShouXuFei,WHO)
        with open(UserCard,‘a+‘) as f:
            f.write("%s:%s提款%s\n" %(NOW(),UserCard,HOW))
    UserInfos[UserCard][2] = WHO

####转账功能
def ZhuangZ(From,TO,How):
    print From,TO
    if How > From:
        print "%s 账号余额不足!" %How
    else:
       From = From - How
       TO = TO + How
       print "转出金额: %s RMB,余额为: %s RMB" %(How,From)

    UserInfos[UserCard][2] = From
    UserInfos[TO_Card][2] = TO
    with open(UserCard,"a+") as f1:
       f1.write("%s:%s扣款%s,输出到:%s!\n" %(NOW(),UserCard,How,TO_Card))
    with open(TO_Card,"a+") as f2:
       f2.write("%s:%s收到来自%s的%s款!\n" %(NOW(),TO_Card,UserCard,How))

###还款功能
def AddMoney(HOW,WHO):
    if HOW > 0:
        print("确定还款:%s" %HOW)
        UserInfos[WHO][2] = UserInfos[WHO][2] + HOW
        with open(WHO,"a+") as f:
            f.write("%s:还款%s\n" %(NOW(),HOW))

##流水查询
def Logs(WHO):
    if os.path.isfile(os.path.join(os.getcwd(),WHO)):
        with open(WHO,‘r‘) as f:
            for line in f.readlines():
    else:
        print("该账号还没有产生交易流水!")

##最后一次访问时间
def LastAccess(WHO):
    UserInfos[WHO][3] = NOW()
#    Write_DB()

##密码修改
def ChgPwd(WHO,NewPass):
    UserInfos[WHO][0] = NewPass
    print("密码修改成功!")

Contex = ["查询余额","转账","提现","流水","还款","修改密码","退出"]

ErrorCount = 0
while ErrorCount < 3 :
    for userinfo in UserInfos.keys():
        UserCard = raw_input("[输入quit|exit退出系统]请输入您的银行卡:").strip()
#        if UserCard == ‘quit‘:sys.exit("您选择退出!")
        if UserCard == ‘‘:continue
        elif UserCard == ‘quit‘ or UserCard == ‘exit‘:
            sys.exit("您选择退出!")
        elif UserCard not in UserInfos.keys():
            print("您输入的银行卡不存在!")
            continue
#        else:
#           print("您输入的有误!")  
        UserPwd = raw_input("[输入quit|exit退出系统]请输入您的密码:").strip()
        if  UserPwd == ‘quit‘ or UserPwd == "exit":
            sys.exit("您选择退出!")
        try:
            if  UserInfos[UserCard][1] != ‘0‘:
                print "%s 账号被锁定!" % UserCard
                ErrorCount +=1
                continue
        except KeyError:
                print "%s 账号不存在!" %UserCard
                ErrorCount +=1
                continue
        if  len(UserPwd) == 0 or UserPwd !=  UserInfos[UserCard][0]:
            print "密码错误!"
            ErrorCount +=1
            continue
        else:
            print "%s 登录成功!您最后一次访问在: %s"  %(UserCard,UserInfos[UserCard][3])
            LastAccess(UserCard)   #登录成功,写入访问时间

            while True:
                print(("请选择你需要的服务:").center(90,"+"))
                print
                for i in range(len(Contex)):
                    print i,Contex[i].decode("utf-8"),‘\t‘,
                print
                print("+" * 80 + ‘\n‘)
                choice = raw_input("[按6或输入quit退出系统]请选择您的业务编号:")
                if len(choice) == 0:continue
                elif choice == ‘quit‘ or int(choice) == 6 :
                   Write_DB()
                   print("您选择退出系统!")
                   break

                elif int(choice) == 0:
                    LookHow(UserInfos[UserCard][2])
                elif int(choice) == 1:
                    TO_Card = raw_input("请输入对方银行卡:").strip()
                    if len(TO_Card) == 0 or TO_Card == UserInfos[UserCard]:
                        print "账号错误!"
                        continue
                    HowZ = raw_input("输入转账金额:").strip()
                    if len(HowZ) == 0:
                        print "转账金额不能为0!"
                    try:
                        UserInfos[TO_Card]
                    except KeyError:
                         print "对方账号: %s 不存在!" % TO_Card
                         continue
                    else:
                         UserInfos[TO_Card][2] = int(UserInfos[TO_Card][2])
                         ZhuangZ(UserInfos[UserCard][2],UserInfos[TO_Card][2],int(HowZ))

                elif int(choice) == 2:
                    HowTake = raw_input("请选择提取金额:")
                    HowTake = int(HowTake)
                    TakeCrash(HowTake,UserInfos[UserCard][2])
                    Write_DB()
                elif int(choice) == 4:
#                    print UserCard
                    HowAdd = int(raw_input("请输入您要还款的金额:"))
                    AddMoney(HowAdd,UserCard)
                    Write_DB()
                elif int(choice) == 3:
                    Logs(UserCard)
                elif int(choice) == 5:
                    NewPass = raw_input("请输入新的密码:")
                    NewPass2 = raw_input("请再输入一次新密码:")
                    if NewPass == NewPass2:
                        ChgPwd(UserCard,NewPass)
                        Write_DB()
                    else:
                        sys.exit("两次输入的密码不一致!退出密码修改!")

else:
    print("你的账号已锁,请到柜台解锁!")
    UserInfos[UserCard][1] = ‘1‘
    UserInfos[UserCard][3] = NOW()
    Write_DB()

三、功能测试如

$python creat_bank.py

$ python looks_bank.py

四、所有文件如下

$ls -alh

写着用来练习,如有错误之处欢迎指正,交流!

时间: 2024-08-24 06:50:29

python模拟ATM系统的相关文章

python模拟选课系统

要求: 角色:学校.学员.课程.讲师 要求: 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格,通过学校创建课程 4. 通过学校创建班级, 班级关联课程.讲师 5. 创建学员时,选择学校,关联班级 5. 创建讲师角色时要关联学校, 6. 提供两个角色接口 6.1 学员视图, 可以注册, 交学费, 选择班级, 6.2 讲师视图, 讲师可管理自己的班级, 上课时选择班级, 查看班

语言模拟ATM自动取款机系统

C语言实验报告       题目名称:C语言模拟ATM自动取款机系统 C语言模拟实现ATM自动取款机功能:输入密码,余额查询,取款,存款,转账,修改密码,退出功能: 代码实现的功能: 账号及密码输入:用户输入密码,才能进入. 登陆成功界面:共有六个选项,查询余额.取款.存款.转账,修改密码,退出分别对应1,2,3,4,5,6选项,若序号输入不正确会予以提示. 选定1后,进入查询余额界面: 选定2后,进入取款界面: 选定3后,进入存款界面: 选定4后,修改密码,选定5,进入转账:选定6,退出界面:

python 操作mysql数据库之模拟购物系统登录及购物

python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TABLE userinfo ( u_id int(10) not null auto_increment, u_name varchar(35), u_passwd varchar(35), money decimal(10,2), role int(5), primary key(u_id) )CHA

文件及输入输出流模拟ATM机

题目:两部分要求都要实现. 一.ATM机的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0). 模拟ATM的功能设计,用户插卡后显示选择语言界面,输入密码界面,用户输入正确密码(用户输入错误密码,则提示该卡已被锁定,无法操作),则弹出选择界面:存款.取款.转账汇款.修改密码.查询余额. 选择"取款",则显示100元.500元.1000元.1500元.2000元

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库

1.30 Java周末总结①控制显示多少位小数位②读txt和写txt模拟ATM数据库 一.控制显示多少位小数位 有些时候小数位数太多了,想保留多少位小数,这里介绍一种利用四舍五入保留想要的小数位数Math.round四舍五入到整数位,所以把小数乘以整10或整百,在除以整10或整百,就得到想要的位数了 double a = 3.14159265359;double weishu = 5;double b = Math.pow(10,weishu);a = Math.round(a*b)/b; 二.

模拟ATM机银行系统

淄博汉企Java基础考核项目 模拟银行自助终端系统 一. 本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 说明: 1. 对于数据输入异常,可使用java异常处理机制进行处理. 2. 评分将以功能实现与代码规范性相结合的方式进行考核. 3. 如果对项目需求有疑问,可以随时以QQ留言方式联系我进行咨询. 4. 国庆放假期间,每天都有老师在公司值班,10月4日是我在公司值班,10月7日正常上班,欢迎大家到公司来做项目. 二. 项目功能要求: 项目开始运行显示主

模拟ATM机功能(C语言)

/* fuction:模拟ATM机存取功能 date:2014/8/20 by:zhouhaiou*/ #include <stdio.h>#include <string.h>#include <math.h>int money=100000; void query();void transf(); void welcome()//欢迎界面 { printf("\t\t*********************************************

Python模拟接口登录

参考地址:https://blog.csdn.net/rifengxxc/article/details/77414090 下面讲下关于python模拟登录实验,之前怎么调试也不行,我也是摸索了好久,结合网上一些资料,终于把我们的系统实现了登录操作.首先,我们的系统有重定向跳转,先post请求302,然后进行get请求: 以下代码仅供参考! #_*_coding:utf-8_*_import requests,base64# var=base64.b64encode("123456")

Python模拟数据工具哪些比较好用

今天给大家推荐两款基本的Python模拟数据工具:mock和pytest monkeypatch. 为什么要模拟数据? 我们的应用中有一些部分需要依赖外部的库或对象.为了隔离开这部分,我们需要代替这些外部依赖,因而就用到了模拟数据.我们模拟外部的API来产生特定的行为,比如说返回符合之前定义的恰当的返回值. 模拟函数 我们有一个function.py的模块: 然后我们来看下如何将其与Mock库结合使用的: 这里发生了什么?1-4行是为了兼容python 2和3来引入的代码,在python 3中m