用python写atm自动取款_python实例_模拟ATM取款机+购物商城

#-*-UTF-8-*-

importosimportsysimportreimportlogging

BASE_DIR= (os.path.dirname(os.path.abspath(__file__)))

sys.path.append(BASE_DIR)#添加core目录的绝对路径#获取ATM目录的绝对路径

BASE_DIRR_REMOTE =(

os.path.dirname(

os.path.dirname(

os.path.abspath(__file__))))from login importauth_namefrom core importlogin

@auth_namedef verify_password(): #定义装饰账户密码验证的函数

return 'ok'

defcredit_platform():"""信用卡登录界面选项"""

whileTrue:print('1.登录\n2.注册\n3.退出')

bk_server= input("请选择你的服务编号:")ifbk_server.isdigit():

bk_server=int(bk_server)if bk_server <= 3 and bk_server >=0:if bk_server == 1:#调用装饰账户密码验证的函数

username, loginSucces =verify_password()#判断如果loginSucces的返回结果为Ture,进入信用卡服务平台

if str(loginSucces) == 'True':

user_menu(username)elif bk_server == 2:#调用创建新账户功能,并判断是否创建成功

loginSucces =login.create_account()#判断如果loginSucces的返回结果为Ture,返回信用卡登录界面

if str(loginSucces) == 'True':continue

#退出信用卡登录界面

elif bk_server == 3:break

else:print("请输入规范的服务编号!")continue

else:print("错误的服务编号!")continue

defuser_menu(username):"""信用卡用户服务选项

:param username:登录的信用卡账户名"""

whileTrue:print('1.提现\n2.还款\n3.转账\n4.查看额度\n5.冻结账户\n6.退出账户')

bk_server= input("请选择你的服务编号:")ifbk_server.isdigit():

bk_server=int(bk_server)if bk_server <= 6 and bk_server >=0:if bk_server == 1:

creditcard(username)#调用提取现金

elif bk_server == 2:

repayment_Savingsdeposit(username)#调用信用卡还款

elif bk_server == 3:#调用信用卡转账

account_name_a, transfer_money =judge_account(username)

transfer_accounts(account_name_a, transfer_money)elif bk_server == 4:

query_money(username)#调用查询金额

elif bk_server == 5:

loginSucces= Frozen_account(username) #调用冻结账户

if str(loginSucces) == 'True':

credit_platform()elif loginSucces == 'False':pass

elif bk_server == 6:break #退出信用卡服务平台

defcredit_card_field(username, file_name, money_key, line):"""定义一个方法处理信用卡的金额变动

:param username: 信用卡账户名

:param file_name: 账户文件

:param money_key: 金额字段

:param line: 读取账户文件

:return: 返回两个金额数"""total_old=line[money_key]

total_new=line[money_key]

total_new= re.match("^\d\d*", total_new)

total_new=total_new.group()

total_new=int(total_new)returntotal_old, total_new, linedefcreditcard(username):"""服务类型:提取现金

扣取信用卡金额

:param username: 信用卡账户名"""

#获取账户文件

file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查账户文件是否存在

login.file_exist_check(file_name)#调用读取账户文件

file_line = login.configure_file(file_name, 'r')whileTrue:

with open(file_name,'w', encoding="utf-8")as f:for line infile_line:

line= eval(line) #将每条账户信息转成字典

user = line["account"][0] #获取账户名

#如果账户名在这条字典里,就提示输入金额数

if username inuser:#调用信用卡字段处理方法获取两个金额数

total_old, total_new, line =credit_card_field(

username, file_name,"credit_money", line)

draw_money= input("请输入提取的金额数:").strip()ifdraw_money.isdigit():

draw_money=int(draw_money)#如果输入的金额数小于等于总金额数,就扣取金额

if draw_money <=total_new:

total_new-= draw_money #减去金额

total_new *= 0.5 #减去%5手续费金额

#把新的金额数跟之前的金额数做替换并写入账户文件

line_update =str(line).replace(

str(total_old), str(total_new))

f.write("%s\n" %line_update)#调用日志文件记录扣取的金额数

logging.info("username:%s,business:Withdrawals,credit card---Amount of deducted amount:%s" %(str(username), str(draw_money)))#调用现金储蓄文件,把扣取的金额数加入到文件中

savingsdeposit_card(username, draw_money)continue #递归查询账户文件

else:print("取款数额超出信用卡金额范围!")break

#如果这个账户名不在这条字典里,直接写入原文件

else:

line=str(line)

f.write("%s\n" %line)else:break

defsavingsdeposit_card(username, draw_money):"""服务类型:提取现金

存入金额到现金储蓄文件

:param username: 账户名

:param draw_money: 信用卡扣取的金额数"""

#获取储蓄文件

file_name = (BASE_DIRR_REMOTE + r"\core\savings.txt")#检查文件是否存在

login.file_exist_check(file_name)#读取储蓄文件

file_line = login.configure_file(file_name, 'r')

with open(file_name,'w', encoding='utf-8')as f:for line infile_line:

line= eval(line) #将每条账户信息转成字典

user = line["cash_money"][0] #获取账户名

#如果账户名在这条字典里,就加上金额数并替换之前的金额数写入储蓄文件

if username inuser:

line_old= line["cash_money"][1]

line_new= line["cash_money"][1]

line_new=int(line_new)

line_new+=draw_money

line_update=str(line).replace(str(line_old), str(line_new))

f.write("%s\n" %line_update)print("\033[1;32m----提现成功----\033[0m")#调用日志文件记录存入的金额数

logging.info("username:%s,business:Withdrawals,Memory card---Amount of deposit:%s" %(str(username), str(draw_money)))#如果账户名不在这条字典里,直接写入原文件

else:

line=str(line)

f.write("%s\n" %line)defrepayment_Savingsdeposit(username):"""服务类型:信用卡还款

扣取储蓄文件金额

:param username: 账户名"""

#获取储蓄文件

file_name = (BASE_DIRR_REMOTE + r"\core\savings.txt")#检查文件是否存在

login.file_exist_check(file_name)#读取储蓄文件

file_line = login.configure_file(file_name, 'r')whileTrue:

with open(file_name,'w', encoding='utf-8')as f:for line infile_line:

line= eval(line) #将每条账户信息转成字典

user = line["cash_money"][0] #获取账户名

#如果账户名在这条字典里,提示输入金额数

if username inuser:

line_old= line["cash_money"][1]

line_new= line["cash_money"][1]

repay_money= input("请输入还款的金额数:").strip()ifrepay_money.isdigit():

repay_money=int(repay_money)

line_new=int(line_new)#如果输入的金额数小于等于总金额数,就扣取金额并替换原来的金额数并写入储蓄文件

if repay_money <=line_new:

line_new-=repay_money

line_update=str(line).replace(

str(line_old), str(line_new))

f.write("%s\n" %line_update)#调用日志文件记录扣取的金额数

logging.info("username:%s,business:repayment,Memory card---Amount of deducted amount:%s" %(str(username), str(repay_money)))#调用信用卡账户文件,把扣取的金额数加入到文件中

repayment_creditcard(username, repay_money)else:print("取款数额超出信用卡金额范围!")break

else:print("请输入规范的金额数!")break

#如果账户名不在这条字典里,直接写入原文件

else:

line=str(line)

f.write("%s\n" %line)continue #递归查询储蓄文件

else:break

defrepayment_creditcard(username, repay_money):"""服务类型:信用卡还款

存入金额到信用卡账户文件

:param username: 账户名

:param repay_money: 储蓄文件扣取的金额数"""

#获取账户文件

file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查文件是否存在

login.file_exist_check(file_name)#读取账户文件

file_line = login.configure_file(file_name, 'r')

with open(file_name,'w', encoding='utf-8')as f:for line infile_line:

line= eval(line) #将每条账户信息转成字典

user = line["account"][0] #获取账户名

#如果账户名在这条字典里,就调用信用卡字段处理方法获取两个金额数

if username inuser:

total_old, total_new, line=credit_card_field(

username, file_name,"credit_money", line)

total_new+= repay_money #加上金额数到信用卡账户文件

#把新的金额数跟之前的金额数做替换,并写入信用卡账户文件

line_update =str(line).replace(str(total_old), str(total_new))

f.write("%s\n" %line_update)print("\033[1;32m----还款成功----\033[0m")#调用日志文件记录存入的金额数

logging.info("username:%s,business:repayment,credit card---Amount of deposit:%s" %(str(username), str(repay_money)))else:#如果账户名不在这条字典里,直接写入原文件

line =str(line)

f.write("%s\n" %line)defjudge_account(username):"""服务类型:信用卡转账

信用卡账户转账服务

:param username: 账户名

:return 返回输入的账户名和扣取的金额数"""

#获取信用卡账户文件

file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查文件是否存在

login.file_exist_check(file_name)#读取信用卡账户文件

file_line = login.configure_file(file_name, 'r')whileTrue:#获取输入的两次账户名

account_name_a = input("请输入转账的用户名:").strip()

account_name_b= input("请再次输入转账的用户名:").strip()#判断账户名是否是字符串类型

if account_name_a.isalpha() andaccount_name_b.isalpha():#如果两次输入的账户名不一致打印错误信息,并要求重新输入

if account_name_a !=account_name_b:print("两次用户名不一致!")continue

#如果两次输入的账户名都等于当前登录的账户名,就提示错误信息,并要求重新输入

elif account_name_a == username and account_name_b ==username:print("不可以给自己转账!")continue

else:

with open(file_name,'r+', encoding='utf-8')as f:#将每条账户信息转成字典

for line_transfer_money infile_line:

line_transfer_money=eval(line_transfer_money)#获取每条字典的账户名

user = line_transfer_money["account"][0]#如果账户名在这条字典里就截取这条账户信息的金额数

if username inuser:

total_old= line_transfer_money["credit_money"]

total_new= line_transfer_money["credit_money"]#获取输入的转账金额数

transfer_money = input("请输入转账的金额:").strip()#判断是否是整数类型

iftransfer_money.isdigit():

transfer_money=int(transfer_money)

total_new=int(total_new)#如果输入的金额数小于等于总金额数,就扣取金额并替换原来的金额数并写入账户文件

if transfer_money <=total_new:

total_new-=transfer_money

line_update=str(line_transfer_money).replace(

str(total_old), str(total_new))

f.write("%s\n" %line_update)#调用日志文件记录扣取的金额数

logging.info("username:%s,business:Transfer accounts,credit card---Number of transfers:%s" %(str(username), str(transfer_money)))#调用转账功能需要被转账的账户

#transfer_accounts(account_name_a,transfer_money)

else:print("取款数额超出信用卡金额范围!")break

else:print("请输入规范的金额数!")break

else:#如果账户名不在这条字典里,直接写入原文件

line_transfer_money =str(line_transfer_money)

f.write("%s\n" %line_transfer_money)#transfer_accounts(account_name_a, transfer_money)

continue

else:returnaccount_name_a, transfer_moneydeftransfer_accounts(account_name_a, transfer_money):"""服务类型:信用卡转账

:param account_name_a: 被转账的账户名

:param transfer_money:信用卡账户扣取的金额数"""

#获取账户文件

file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查文件是否存在

login.file_exist_check(file_name)#读取账户文件

file_line = login.configure_file(file_name, 'r')whileTrue:

with open(file_name,'r+', encoding='utf-8')as f:for line_transfer_money infile_line:

line_transfer_money= eval(line_transfer_money) #将每条账户信息转成字典

user = line_transfer_money["account"][0] #获取每条字典的账户名

#如果账户名在这条字典里就将金额数加到总金额数,并替换字典原来的金额数后写入账户文件

if account_name_a inuser:

line_old= line_transfer_money["credit_money"]

line_new= line_transfer_money["credit_money"]

line_new=int(line_new)

line_new+=transfer_money

line_update=str(line_transfer_money).replace(

str(line_old), str(line_new))

f.write("%s\n" %line_update)print("\033[1;32m----转账成功----\033[0m")#调用日志文件记录存入的金额数

logging.info("username:%s,business:Transfer accounts,Memory card---Amount of deposit:%s" %(str(account_name_a), str(transfer_money)))else:#如果账户名不在这条字典里,直接写入原文件

line_transfer_money =str(line_transfer_money)

f.write("%s\n" %line_transfer_money)else:break

defquery_money(username):"""查询信用卡账户余额

:param username: 账户名"""

#获取账户文件

file_name = (BASE_DIRR_REMOTE + r"\core\account.txt")#检查文件是否存在

login.file_exist_check(file_name)#读取账户文件

file_line = login.configure_file(file_name, 'r')for line infile_line:

line= eval(line) ## 将每条账户信息转成字典

user = line["account"][0] #获取每条字典的账户名

#如果账户名在这条字典里,就打印这个账户的余额信息

if username inuser:print('%s\n用户名:%s 信用卡剩余余额:%s\n%s\n' %('=' * 50, username, line['credit_money'], '=' * 50))defFrozen_account(username):"""冻结账户

:param username: 账户名

:return 返回冻结账户是否成功状态"""

#获取冻结文件

file_name = (BASE_DIRR_REMOTE + r"\core\frozen.txt")#检查文件是否存在

login.file_exist_check(file_name)#读取冻结文件

file_line = login.configure_file(file_name, 'r')whileTrue:

loginSucces=False#如果文件的行数不等于0,就把每条信息转成字典

if len(file_line) !=0:for line_locking infile_line:

line_locking=eval(line_locking)#如果账户名在冻结文件里就输出打印信息

if username in line_locking['frozen_username']:print("该账户已处于冻结状态!")#如果账户名不在冻结文件里,就输出是否冻结该用户提示

elif username not in line_locking['frozen_username']:

locking= input("是否确定冻结该账户?y/n:")iflocking.isalpha():#如果等于y,就把该账户名追加写入冻结文件,并返回loginSucces状态

if locking == "y":

with open(file_name,'a+', encoding='utf-8')as f:

f.write("\n{'frozen_username':'%s'}" %username)print("\033[1;32m该账户冻结成功!\033[0m")

loginSucces=TruereturnloginSucces#如果等于n,直接返回loginSucces状态

elif locking == "n":returnloginSucceselse:print("错误的选项请重新输入!")continue

else:print("输入的数据类型不符合规范,请重新输入!")continue

#如果行数等于0,就输出是否冻结该账户提示

if len(file_line) ==0:

locking= input("是否确定冻结该账户?y/n:")iflocking.isalpha():#如果等于y,就把该账户名追加写入冻结文件,并返回loginSucces状态

if locking == "y":

with open(file_name,'w', encoding='utf-8')as f:

f.write("{'frozen_username':'%s'}\n" %username)print("\033[1;32m该账户冻结成功!\033[0m")

loginSucces=TruereturnloginSucces#如果等于n,直接返回loginSucces状态

elif locking == "n":returnloginSucceselse:print("\033[1;31m错误的选项请重新输入!\033[0m")continue

else:print("\033[1;31m输入的数据类型不符合规范,请重新输入!\033[0m")continue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值