函数相关作业
- 1、编写文件修改功能,调用函数时,传入三个参数(修改的文件路径,要修改的内容,修改后的内容)既可完成文件的修改
- 2、编写tail工具
- 3、编写登录功能
- 4、编写注册功能
- 5、编写用户认证功能
- 选做题:编写ATM程序实现下述功能,数据来源于文件db.txt
- 1、充值功能:用户输入充值钱数,db.txt中该账号钱数完成修改
- 2、转账功能:用户A向用户B转账1000元,db.txt中完成用户A账号减钱,用户B账号加钱
- 3、提现功能:用户输入提现金额,db.txt中该账号钱数减少
- 4、查询余额功能:输入账号查询余额
- 选做题中的选做题:登录功能
- 用户登录成功后,内存中记录下该状态,上述功能以当前登录状态为准,必须先登录才能操作
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')