day11作业(函数相关作业,ATM程序)

本文档详细介绍了使用Python编程实现ATM(自动取款机)程序的功能,包括充值、转账、提现和查询余额。此外,还涵盖了文件修改、tail工具和登录注册等基本功能。所有操作的数据存储于db.txt文件中,用户必须先登录才能进行ATM操作。
摘要由CSDN通过智能技术生成

1、编写文件修改功能,调用函数时,传入三个参数(修改的文件路径,要修改的内容,修改后的内容)既可完成文件的修改

self

#方法一
def alter(path,old,new):
	with open(r'{}'.format(address),mode="r",encoding='gbk')as read_f:
		data = read_f.read()
		print(data)
	with open(r'{}'.format(address),mode='w',encoding='gbk')as write_f:
		write_f.write(data.replace(old,new))

address = input("请输入文件地址: ").strip()
old_word = input("请输入要修改的内容: ").strip()
new_word = input("请输入修改后的内容: ").strip()

alter(address,old_word,new_word)
# #方法二:
def alter(path,old,new):
	import os
	with open(r'{}'.format(address),mode="rt",encoding="gbk")as read_f,\
		open("b.txt",mode="wt",encoding='gbk')as write_f:
		for line in read_f:
			write_f.write(line.replace(old,new))
	os.remove(r'{}'.format(address))
	os.rename('b.txt',path)
address=input("请输入文件地址: ")
old_word = input("请输入要修改的内容: ")
new_word = input("请输入修改后的内容: ")

alter(address,old_word,new_word)

reference

原文件内的内容为:

小鸟妈妈问小鸟
今天扎什么发型
小鸟说
jiujiu
import os  # 与操作系统交互的模块

# 函数定义
def change_file(file_path,old_data,new_data):
	'''
	这是一个修改文件内容的函数功能
	:param file_path: 修改的文件路径
	:param old_data: 要修改的内容
	:param new_data: 修改后的内容
	:return: 
	'''
	
	# 判断需要修改的文件路径是否存在,若不存在则结束函数
	# 通过os.path.exists判断file_path路径是否存在,存在返回True,不存在返回False
	if not os.path.exists(file_path):
		print('需要修改的文件不存在')
		return
		
		# 1) 先根据file_path文件路径,读取文件中的数据
	with open(file_path,'r',encoding='utf-8')as f:
		res = f.read()
		
		if old_data not in res:
			print("需要修改的数据不存在")
			return
		
		# 2) 将文件中读取出来的数据,将old_data,改为new_data
		new_res=res.replace(old_data,new_data)
	
	# 3) 将修改后的内容,重新写入到文件中
	with open(file_path,'w',encoding='utf-8')as f:
		f.write(new_res)

# 函数调用
# 将jiujiu改为啾啾
change_file('db.txt','jiujiu','啾啾')

2、编写tail工具

self

import time
with open("diary.txt", mode="a", encoding='utf-8')as f:
	f.write("%s 用户给某商户转账15元\n" % time.strftime('%Y-%m-%d %H:%M:%S'))

def func(path):
	import time
	with open(r'{}'.format(address),mode='rb')as f:
		#f.seek(0,2)
		while True:
			line = f.readline()
			if len(line) == 0:
				time.sleep(0.2)
			else:
				print(line.decode('utf-8'),end="")
address=input("请输入您想要监测的文件路径: ").strip()
func(address)

reference

#tail工具  Linux 工具 ,用于查看日志,监听日志
# 日志:记录用户使用软件的记录,比如某些操作成功或者失败,哪些时间段来使用你的软件
import  os
import time # 时间模块,可以进行时间的转换以及程序的延时操作等...

#函数定义
def tail_util(log_path):
	'''
	用于监听日志数据
	:param log_path: 日志文件路径
	:return:
	'''
	number = 1

	if not os.path.exists(log_path):
		print('需要修改的文件不存在')
		return

	#打开日志文件
	with open(log_path,'rb')as f:
		#指针移动到末尾
		f.seek(0,2)
		while True:
			#通过循环,从文件末尾开始读取数据
			line =f.readline() # 读取出来的是二进制数据
			if line:
				print('最新日志:[%s]' % line.decode('utf-8'))
			else:
				print('第%s次等待开始...' % number)
				time.sleep(1)

				number+=1
# 函数调用
tail_util('access.log')

3、编写登录功能

self(ღღღ)

def login():
	tag = True
	while tag:
		accountlist=[]
		pwdlist=[]
		username=input("请输入用户名: ").strip()
		with open('user.txt',mode='r',encoding='utf-8')as f:
			lst=f.readlines()
			for i in lst:
				name,pwd=i.strip().split(":")
				accountlist.append(name)
				pwdlist.append(pwd)
			if username in accountlist:
				num=accountlist.index(username)
				password = input("请输入密码: ").strip()
				if password == pwdlist[num]:
					print("登录成功")
					tag=False
					break
				else:
					print("密码错误")
			else:
				print("账号不存在")

login()

reference

def login():
	user = input('请输入用户名: ').strip()
	pwd = input('请输入密码: ').strip()
	if user == 'juanfu' and pwd == '666':
		print('login success')
	else:
		print('login error')
		
login()

4、编写注册功能

self

def register():
	accountlist=[]
	while True:
		username=input("请输入用户名: ").strip()
		with open('user.txt',mode='r',encoding='utf-8')as f:
			lst=f.readlines()
			for i in lst:
				name,pwd=i.strip().split(":")
				accountlist.append(name)
			if username in accountlist:
				print("用户名已存在,请重新注册用户名")

			else:
				password=input("请输入密码: ").strip()
				with open('user.txt',mode='a',encoding='utf-8')as f:

					f.write("%s:%s\n" % (username,password))
				print("注册成功".center(50,'*'))
				break

register()

reference

def register():
	user = input('请输入用户名:').strip()
	pwd = input('请输入密码:').strip()
	re_pwd = input('请确认密码: ').strip()
	if pwd == re_pwd:
		# 将数据保存到文件中(省略此步骤)
		print('register success')
	else:
		print('register error')
		
register()

5、编写用户认证功能

reference

'''
ATM
注册功能
登录功能
'''
#取钱:需要先登录,只提供给tank使用,egon不能使用
# def withdraw():
# 	pass

# 转账:需要先登录,只提供给egon使用,tank不能使用
# def transfer():
# 	pass

def user_auth(role):
	if role == 'tank':
		withdraw()
	elif role == 'egon':
		transfer()
		
user_auth('tank')

选做题:编写ATM程序实现下述功能,数据来源于文件db.txt

1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改

def recharge():
	n=input("请输入用户名:")
	m=input("请输入充值金额: ")
	namelist=[]
	moneylist=[]
	with open ('db.txt',mode='r',encoding='utf-8')as f:
		lst=f.readlines()
		for i in lst:
			name,pwd,money=i.strip().split(":")
			namelist.append(name)
			moneylist.append(money)
			if n in namelist:
				num=namelist.index(n)
				new_money=int(moneylist[num])+int(m)
	with open('db.txt',mode='r',encoding='utf-8')as read_f:
		data=read_f.read()
	with open('db.txt',mode='w',encoding='utf-8')as write_f:
		write_f.write(data.replace('{}'.format(moneylist[num]),'{}'.format(new_money)))
		print("充值成功")

recharge()

2、转账功能:用户A向用户B转账1000元,db.txt中完成用户A账号减钱,用户B账号加钱

import os
def transfer(user1,user2,money):
	'''
	:param user1: 转账用户a
	:param user2: 转账用户b
	:param money: 转账金额
	:return: 
	'''
	db_path = 'db2.txt'
	with open(db_path,'r',encoding='utf-8')as f,\
			open('new_data.txt','w',encoding='utf-8')as t:
		# 1)将db_path文件数据一行一行读取出来,将所有用户添加到列表
		for line in f:
			# 2)判断如果user1 在 在当前这行数据中,证明找到该用用户
			if user1 in line:
				a_user = line.strip().split(':')
			elif user2 in line:
				b_user = line.strip().split(':')
			else:
				print('用户a或用户b不存在')
				return
		# 3)判断用户a的金额是否足够
		a_user_money = int(a_user[2])
		if a_user_money >= money:
			# 4) 若判断成立,则给用户a减钱,用户b加钱
			a_user_money -= money
			# 将用户a修改后的金额,重复赋值
			a_user[2] = str(a_user_money)
			
			b_user_money = int(b_user[2]) + money
			b_user[2] = str(b_user_money)
		else:
			print('转账金额不足')

		# 4) 拼接两个用户的数据
		a_user_data = ':'.join(a_user) + '\n'
		b_user_data = ':'.join(b_user) + '\n'

		# 5) 将修改后的用户数据,写入新的文件中
		t.write(a_user_data)
		t.write(b_user_data)
	os.remove(db_path)
	os.rename('new_data.txt',db_path)
transfer('egon','tank',1000)

3、提现功能:用户输入提现金额,db.txt中该账号钱数减少

self

def recharge():
	n=input("请输入用户名:")
	m=input("请输入提现金额: ")
	namelist=[]
	moneylist=[]
	with open ('db.txt',mode='r',encoding='utf-8')as f:
		lst=f.readlines()
		for i in lst:
			name,pwd,money=i.strip().split(":")
			namelist.append(name)
			moneylist.append(money)
			if n in namelist:
				num=namelist.index(n)
				new_money=int(moneylist[num])-int(m)
	with open('db.txt',mode='r',encoding='utf-8')as read_f:
		data=read_f.read()
	with open('db.txt',mode='w',encoding='utf-8')as write_f:
		write_f.write(data.replace('{}'.format(moneylist[num]),'{}'.format(new_money)))
		print("提现成功")

recharge()

reference

def withdraw(user, money):
    '''
    :param user: 提现用户
    :param money: 提现金额
    :return:
    '''
    db_path = 'db3.txt'
    with open(db_path, 'r', encoding='utf-8') as f:
        # 1)将db_path文件数据一行一行读取出来,将所有用户添加到列表
        for line in f:

            # 2)判断如果user1 在 在当前这行数据中,证明找到该用用户
            if user in line:
                old_user_data = line
                user_data = line.strip().split(':')

        # 3)判断用户a的金额是否足够
        user_money = int(user_data[2])

        if user_money >= money:
            # 4) 若判断成立,则给用户a减钱,用户b加钱
            user_money -= money
            # 将用户a修改后的金额,重复赋值
            user_data[2] = str(user_money)

        else:
            print('提现金额不足!')

        # 5) 拼接用户数据
        new_user_data = ':'.join(user_data) + '\n'

    with open(db_path, 'r', encoding='utf-8') as f, open('new_data.txt', 'w', encoding='utf-8') as t:
        # 6) 将修改后的用户数据,写入新的文件中
        data = f.read().replace(old_user_data, new_user_data)
        t.write(data)

    os.remove(db_path)
    os.rename('new_data.txt', db_path)


# withdraw('egon', 99)
# withdraw('tank', 1)

4、查询余额功能:输入账号查询余额

self

def get_balance(n):
	namelist=[]
	moneylist=[]
	with open('db.txt',mode='r',encoding='utf-8')as f:
		lst=f.readlines()
		for i in lst:
			name,pwd,money=i.strip().split(':')
			namelist.append(name)
			moneylist.append(money)
		if n in namelist:
			num=namelist.index(n)
			print('您的余额为%s元'%(moneylist[num]))

get_balance(n='ceshi1')

reference

def check_money(user):
    '''
    :param user: 查看的用户
    :return:
    '''   
    with open(db_path, 'r', encoding='utf-8') as f:
         # 1)将db_path文件数据一行一行读取出来,将所有用户添加到列表
        for line in f:

             # 2)判断如果user1 在 在当前这行数据中,证明找到该用用户
            if user in line:
                user, pwd, money = line.strip().split(':')
                print(money)

check_money('egon')

选做题中的选做题:登录功能

用户登录成功后,内存中记录下该状态,上述功能以当前登录状态为准,必须先登录才能操作

# 登录功能
def login():
    user = input('请输入用户名:').strip()
    pwd = input('请输入密码:').strip()
    if user == 'tank' and pwd == '123':
        # 若用户登录成功,给user_info赋值,证明用户已登录
        global user_info  # 函数内部可以修改外部的不可变类型的变量
        user_info = user

        print('login success!')
    else:
        print('login error!')


login()

# 充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改
def change_money(db_path):
    with open(db_path, 'r', encoding='utf-8') as f, open('new_data.txt', 'w', encoding='utf-8') as t:
        # 1)将db_path文件数据读取出来
        user, pwd, money = f.read().strip().split(':')
        print(user, pwd, money)
        # 2)让用户输入充值金额,其实就是修改金额
        while True:
            add_money = input('请输入需要充值的金额: ').strip()
            if not add_money.isdigit():
                print('请输入正确的金额。')
                continue

            money = int(money) + int(add_money)
            break

        # 3)做字符串的拼接
        user_list = [user, pwd, str(money)]
        new_data = ':'.join(user_list)

        # 3) 将修改后的用户数据,写入新的文件中
        t.write(new_data)

    # 4) 新老文件替换,让用户觉得我没有创建新的文件
    # mac系统,window系统会报错
    # os.rename('new_data.txt', db_path)

    # window系统
    os.remove(db_path)
    os.rename('new_data.txt', db_path)


# change_money('db.txt')

# 2、转账功能:用户A向用户B转账1000元,db2.txt中完成用户A账号减钱,用户B账号加钱
def transfer(user1, user2, money):
    '''
    :param user1: 转账用户A
    :param user2: 接收用户B
    :param money: 转账金额
    :return:
    '''
    db_path = 'db2.txt'
    with open(db_path, 'r', encoding='utf-8') as f, open('new_data.txt', 'w', encoding='utf-8') as t:
        # 1)将db_path文件数据一行一行读取出来,将所有用户添加到列表
        for line in f:

            # 2)判断如果user1 在 在当前这行数据中,证明找到该用用户
            if user1 in line:
                a_user = line.strip().split(':')

            elif user2 in line:
                b_user = line.strip().split(':')

            else:
                print('用户a或用户b不存在!')
                return

        # 3)判断用户a的金额是否足够
        a_user_money = int(a_user[2])
        if a_user_money >= money:
            # 4) 若判断成立,则给用户a减钱,用户b加钱
            a_user_money -= money
            # 将用户a修改后的金额,重复赋值
            a_user[2] = str(a_user_money)

            b_user_money = int(b_user[2]) + money
            b_user[2] = str(b_user_money)

        else:
            print('转账金额不足!')

        # 4) 拼接两个用户的数据
        a_user_data = ':'.join(a_user) + '\n'
        b_user_data = ':'.join(b_user) + '\n'

        # 3) 将修改后的用户数据,写入新的文件中
        t.write(a_user_data)
        t.write(b_user_data)

    os.remove(db_path)
    os.rename('new_data.txt', db_path)


# transfer('egon', 'tank', 1)


# 3、提现功能:用户输入提现金额,db.txt中该账号钱数减少
def withdraw(user, money):
    '''
    :param user: 提现用户
    :param money: 提现金额
    :return:
    '''
    db_path = 'db3.txt'
    with open(db_path, 'r', encoding='utf-8') as f:
        # 1)将db_path文件数据一行一行读取出来,将所有用户添加到列表
        for line in f:

            # 2)判断如果user1 在 在当前这行数据中,证明找到该用用户
            if user in line:
                old_user_data = line
                user_data = line.strip().split(':')

        # 3)判断用户a的金额是否足够
        user_money = int(user_data[2])

        if user_money >= money:
            # 4) 若判断成立,则给用户a减钱,用户b加钱
            user_money -= money
            # 将用户a修改后的金额,重复赋值
            user_data[2] = str(user_money)

        else:
            print('提现金额不足!')

        # 5) 拼接用户数据
        new_user_data = ':'.join(user_data) + '\n'

    with open(db_path, 'r', encoding='utf-8') as f, open('new_data.txt', 'w', encoding='utf-8') as t:
        # 6) 将修改后的用户数据,写入新的文件中
        data = f.read().replace(old_user_data, new_user_data)
        t.write(data)

    os.remove(db_path)
    os.rename('new_data.txt', db_path)


# withdraw('egon', 99)
# withdraw('tank', 1)

# 4、查询余额功能:输入账号查询余额
def check_money(user):
    '''
    :param user: 查看的用户
    :return:
    '''
    if user_info:
        db_path = 'db3.txt'
        with open(db_path, 'r', encoding='utf-8') as f:
            # 1)将db_path文件数据一行一行读取出来,将所有用户添加到列表
            for line in f:

                # 2)判断如果user1 在 在当前这行数据中,证明找到该用用户
                if user in line:
                    user, pwd, money = line.strip().split(':')
                    print(money)
    else:
        print('用户没登录,请先登录!')
        login()


check_money('egon')


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值