文件的读写模式、操作模式和操作方法

文件读写模式

# 补充知识
    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
"""
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
"""
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()

posted @ 2022-06-29 16:18  荀飞  阅读(200)  评论(0编辑  收藏  举报