Python实现ATM系统:充值、转账、提现与余额查询完整代码解析

Finn
Finn
发布时间:2026-10-13 | 3人浏览过
原创

本文详细介绍如何使用Python编写一个具备充值、转账、提现及余额查询功能的ATM系统。通过读写db.txt文件实现数据持久化,结合登录状态验证确保操作安全。文章提供完整代码逻辑与模拟运行结果,帮助开发者掌握基础文件IO与业务逻辑处理。

ATM系统功能概述与数据源

本示例旨在通过Python代码实现一个简易ATM系统,其核心数据交互依赖于本地文件db.txt进行存储与更新。

系统需支持充值模块:用户输入指定金额后,程序将读取db.txt中对应账号的现有余额,加上充值金额后重新写入文件,完成资金变更。

系统需支持转账模块:实现用户A向用户B转账指定金额(如1000元)的功能。程序需确保在db.txt中准确扣除用户A的账户余额,并同步增加用户B的账户余额,保证账目平衡。

系统需支持提现模块:用户输入期望提取的金额,程序验证后从db.txt中该账号的当前余额里扣除相应数值,并更新文件记录。

系统需支持余额查询模块:用户输入账号后,程序从db.txt中读取该账号的最新余额并返回显示。

系统必须包含用户登录验证功能,作为访问其他业务模块的前置条件。

用户登录成功后,程序需在内存中维护该用户的登录状态标识。所有后续的业务操作(充值、转账、提现、查询)均基于当前登录状态执行,未登录用户无法进行任何资金操作。

Python核心代码实现

以下是实现上述功能的Python代码示例。

关键业务逻辑代码节选


import os

user_staus = {'username': None}


def ad_credit(username, amount):
  """
  充值功能
  :param username:
  :param amount:
  :return:
  """
  if user_staus['username'] is None:
    login()
  with open('db.txt', 'rt', encoding='utf-8')as f1, \
      open('db.txt.swap', 'wt', encoding='utf-8')as f2:
    while True:
      cont = f1.readline()
      if len(cont) == 0:
        break
      name, remain = cont.strip().split(':')
      if username in name:
        remain = int(remain) + int(amount)
        f2.write('{}:{}\n'.format(name, remain))
        print('充值成功,{}的余额为{}'.format(username, remain))
      else:
        f2.write(cont)
  os.remove('db.txt')
  os.rename('db.txt.swap', 'db.txt')


def transfer(user_out, user_in, amount):
  '''3
  转账功能
  :param user_out:
  :param user_in:
  :param amount:
  :return:
  '''
  if user_staus['username'] is None:
    login()
  with open('db.txt', 'rt', encoding='utf-8')as f1, \
      open('db.txt.swap', 'wt', encoding='utf-8')as f2:

    userinfo = {}
    for line in f1:
      name, remind = line.strip().split(':')
      userinfo[name] = int(remind)
    if user_out not in userinfo:
      print('用户不存在')
      return
    if user_in not in userinfo:
      print('收款方不存在')
      return
    if user_out in userinfo and user_in in userinfo:
      if userinfo[user_out] >= int(amount):
        userinfo[user_out] -= int(amount)
        userinfo[user_in] += int(amount)
        print('转账成功,已成功从{}向{}汇款{}'.format(user_out, user_in, amount))
      elif userinfo[user_out] < amount:
        print('余额不足')
        return
    for name, remind in userinfo.items():
      f2.write('{}:{}\n'.format(name, remind))

  os.remove('db.txt')
  os.rename('db.txt.swap', 'db.txt')


def cashon(username, amount):
  '''
  提现功能
  :param username:
  :param amount:
  :return:
  '''
  if user_staus['username'] is None:
    login()
  with open('db.txt', 'rt', encoding='utf-8')as f1, \
      open('db.txt.swap', 'wt', encoding='utf-8')as f2:
    userinfo = {}
    for line in f1:
      name, remind = line.strip().split(':')
      userinfo[name] = int(remind)
    if username not in userinfo:
      print('用户不存在')
      return
    if username in userinfo and userinfo[username] >= int(amount):
      userinfo[username] -= int(amount)
      print('已从余额中取出{},现余额为{}'.format(amount, userinfo[username]))
    elif userinfo[username] < amount:
      print('余额不足,提现失败')
      return
    for name, remind in userinfo.items():
      f2.write('{}:{}\n'.format(name, remind))
  os.remove('db.txt')
  os.rename('db.txt.swap', 'db.txt')


def check(username):
  '''
  余额查询功能
  :param username:
  :return:
  '''
  if user_staus['username'] is None:
    login()
  with open('db.txt', 'rt', encoding='utf-8')as f:
    userinfo = {}
    for line in f:
      name, remind = line.strip().split(':')
      userinfo[name] = remind
    if username not in userinfo:
      print('用户不存在')
      return
    if username in userinfo:
      print('当前余额为:{}'.format(userinfo[username]))


def login():
  username = input('输入用户名')
  userpassword = input('输入密码')
  with open('login.txt', 'rt', encoding='utf-8')as login_f:
    login = {}
    for line in login_f:
      name, psd = line.strip().split(':')
      login[name] = psd
      if username in login:
        if login[username] == userpassword:
          print('登陆成功')
          user_staus['username'] = username
          break
      elif username not in login:
        print('用户名不存在')
        return


def logout():
  user_staus['username'] = None
  print('已成功登出')
  return


login()
tag = True
while tag:
  cmd = input('''
  请输入你想使用的功能序号
  1:充值
  2:转账
  3:提现
  4:查询余额
  0:登出
  ''')
  if cmd == '1':
    username = input('输入用户名:')
    amount = input('输入充值金额:')
    ad_credit(username, amount)
  elif cmd == '2':
    user_out = input('请输入转账方:')
    user_in = input('请输入接收方:')
    amount = input('输入转账金额:')
    transfer(user_out, user_in, amount)
  elif cmd == '3':
    username = input('输入用户名:')
    amount = input('输入提现金额')
    cashon(username, amount)
  elif cmd == '4':
    username = input('输入用户名:')
    check(username)
  elif cmd == '0':
    logout()
    tag = False
  else:
    print('请正确输入序号')

系统运行结果模拟

以下为该ATM系统的模拟运行输出日志,展示了从登录到执行各项功能的全过程。

'''\n/Users/chenfeng/PycharmProjects/ATM/venv/bin/python /Users/chenfeng/PycharmProjects/ATM/main.py\n输入用户名xilou\n输入密码666\n登陆成功'''

'''请输入你想使用的功能序号\n1:充值\n2:转账\n3:提现\n4:查询余额\n0:登出\n1\n输入用户名:xilou\n输入充值金额:200\n充值成功,xilou的余额为700'''

'''请输入你想使用的功能序号\n1:充值\n2:转账\n3:提现\n4:查询余额\n0:登出\n2\n请输入转账方:xilou\n请输入接收方:heiren\n输入转账金额:200\n转账成功,已成功从xilou向heiren汇款200'''

'''请输入你想使用的功能序号\n1:充值\n2:转账\n3:提现\n4:查询余额\n0:登出\n3\n输入用户名:xilou\n输入提现金额100\n已从余额中取出100,现余额为400'''

'''请输入你想使用的功能序号\n1:充值\n2:转账\n3:提现\n4:查询余额\n0:登出\n4\n输入用户名:xilou\n当前余额为:400'''

'''请输入你想使用的功能序号\n1:充值\n2:转账\n3:提现\n4:查询余额\n0:登出\n0\n已成功登出'''

'''Process finished with exit code 0'''

以上即为Python实现ATM系统核心功能的完整代码与运行示例,希望能为相关学习者提供实用的参考与帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表