文件读写模式
# 补充知识
1.with语法支持一次性打开多个文件
with open(r'a.txt','r',encoding='utf8')as f,open(...) as f1,open(..) as f2 ...
r模式
# 使用该模式打开的文件只能读取内容,不能做其他操作(报错)
#文件路径不存在:r模式直接报错
with open('x.txt','r',encoding='utf8') as file:
file.read() # 报错
#文件路径存在:r模式会打开文件等待读取文件内容
with open('x.txt','r',encoding='utf8') as file:
file.read() # 正常读取
w模式
# 使用该模式打开的文件只能写内容,不能做其他操作
#路径不存在:w模式会自动创建文件并写入数据
with open('x.txt','w',encoding='utf8') as file:
file.write('hello,world')
#文件存在:w模式会先清空该文件内容,之后等待填写新内容
with open('x.txt','w',encoding='utf8') as file:
file.write('你好') # 此前文件的内容就被清空,只有'你好'这个字符串
a模式
# 使用该模式打开的文件默认是在末尾追加新的内容,不能做其他操作(读)
#文件不存在,a模式会自动创建该文件
with open('x.txt','a',encoding='utf8') as file:
file.write()
#文件路径存在:a模式不会先清空该文件内容 只在文件末尾等待填写新内容
文件的操作模式
t模式(文件操作的默认模式)
r rt
w wt
a at
1.只能操作文本文件
2.必须执行encoding参数
3.读写都是以字符串为单位
b模式(二进制模式)
rb wb ab 必须自己指定 不能省略
1.能够操作所有类型的文件
2.不需要指定encoding参数
3.读写都是以bytes为单位
文件的诸多操作方法
read() 一次性读取文件内容并且光标会停留在文件末尾 继续读则为空
"""当文件数据较大的时候 不推荐一次性读取"""
for line in f:
print(line) 文件对象支持for循环一次只读一行
readline() 一次只读一行内容
readlines() 按照行的方式读取所有的内容并组织成列表返回
readable() 判断当前文件是否可读
writable() 判断当前文件是否可写
write() 填写文件内容
writelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
flush() 将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)
案例
"""
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
"""
# 1.获取想要拷贝的数据路径
source_file_path = input('请输入你要拷贝的文件>>>:')
# 2.再获取拷贝到哪个地方的目标路径
target_file_path = input('请输入你要拷贝到的目录路径>>>:')
# 3.读取想要拷贝的数据路径对应的内容,并写入到目标路径
with open('%s' % source_file_path,'rb') as f,open('%s' % target_file_path,'wb') as f1:
for line in f : # 循环读取文件中一行行内容
f1.write(line) # 依次写入新的文件
"""
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
"""
while True:
print("""
1.用户注册功能
2.用户登录功能
3.修改用户密码
""")
func_id = input('请输入功能编号')
if func_id == '1':
name_register = input('请输入用户姓名>>>:').strip()
pwd_register = input('请输入用户密码>>>:').strip()
name_pwd_register = '%s|%s\n' % (name_register, pwd_register)
with open('userinfo.txt', 'r', encoding='utf8') as file_r:
n_list = []
for line in file_r:
real_name = line.split('|')[0]
n_list.append(real_name)
if name_register not in n_list:
with open('./userinfo.txt', 'a', encoding='utf8') as file:
file.write(name_pwd_register) # 将账户密码写入文件
file.flush()
print('用户注册成功')
else:
print("该用户已注册")
if func_id == '2':
# 用于记录当前成功登录的某个用户名和密码,改密码时需要拿当前登录的用户名和密码和文件内的比较,指定修改某个账户密码
temp_login = []
name_login = input('请输入用户姓名>>>:').strip()
pwd_login = input('请输入用户密码>>>:').strip()
name_pwd_login = '%s|%s' % (name_login,pwd_login)
with open('userinfo.txt', 'r', encoding='utf8') as file1:
name_list = []
for line in file1:
name_list.append(line.strip())
file1.flush()
if name_pwd_login in name_list:
print('登录成功')
temp_login.append(name_login)
temp_login.append(pwd_login)
else:
print('用户名或者密码错误')
def chick_info():
modify= input(f'您当前的用户名为>>>:{temp_login[0]},密码为>>>:{temp_login[1]},确认y,其他退出')
if modify == 'y':
new_pwd = input('请输入新的密码>>>:')
with open('userinfo.txt', 'r', encoding='utf8') as f:
res = f.read()
with open('userinfo.txt', 'w', encoding='utf8') as f1:
if '|'.join(temp_login) == line.strip():
f1.write(res.replace(temp_login[1], new_pwd)) # 修改密码,此处有bug,应该用户名|密码一起修改
f1.flush()
print('密码修改成功')
else:
return
def outer(func):
def wrapper(*args, **kwargs):
try:
if name_pwd_login in name_list:
func(*args, **kwargs)
else:
print('未登录没有权限查看修改密码')
except NameError:
print('请先正确登录')
return wrapper
chick_info = outer(chick_info)
if func_id == '3':
chick_info()