## 文件操作基础 ### 文件操作 文件是操作系统暴露给用户操作硬盘的快捷方式 ### 代码打开文件的两种方式 ```python 直接打开模式 open(r'文件路径','打开模式') # 建议加上r 上下文管理模式推荐使用这个 with open(r'文件路径','打开模式') as f,open(r'文件路径','打开模式') as f2: #子代码 上下文支持同时打开多个文件以逗号分隔 ``` ## 文件读写 ```python 'r'读 只读不能写 文件不存在报错 文件存在正常读取 with open(r'a.txt','r','utf-8') as f f.read() 'w'写 只写不能读 文件不存在创建文件打开 文件存在清空文件内容 with open(r'a.txt','w','utf-8') as f f.write('追加数据') 'a'追加 只在在文件最后写入数据 文件不存在创建文件 文件存在在最后追加数据 with open(r'a.txt','a','utf-8') as f f.write('我在最后') ``` ## 文件操作模式 ```python open 默认打开模式为文本模式 rt wt at 文本模式 rt wt at 只能操作文本文件 文本模式读写以字符为单位 需要指定打开编码 encoding='utf-8' 如果不指定者使用计算机默认编码 二进制模式 rb wb ab 什么文件都能操作 读写以字节为单位 不能指定打开编码,因为已经是二进制模式了 二进制模式与文本模式针对路径是否存在的情况下 规律是一样的 ``` ## 文件的方法 ```python 读方法 1.read() 一次性读取文件所有数据并且光标停在最后 继续读取则没有内容 并且当文件内容比较多的时候 该方法还可能会造成计算机内存溢出 括号内还可以写数字 在文本模式下以字符为单位,表示读取几个字符 在字节模式下,表示读取几个字节 2.for循环 一行一行读取文件避免内存溢出现象的产生 3.readline() 一次读取一行 4.readlines() 一次读取所有行,按照行数,放在一个列表里 5.readable() 检查是否可读 写方法 1.write() 写入数据 2.writelines() 传入列表,一次性将列表的所有数据写入文件 3.writeable() 检查文件是否可写 4.fluse() 立即将内存的数据刷入到文件,等于ctrl + s ``` ## 文件内光标的移动 ```python seek() 两个参数 第一个参数是偏移量 都是以字节偏移 第二个参数是,参考位置 0 文本二进制都可用为文件头 1 只能二进制当前光标的位置 2 只能二进制文件末尾位置 tell() 返回当前光标距离文件头的距离 ``` ### 文件光标实战 ```python import time with open('b.txt', 'rb') as f: f.seek(0,2) while True: res = f.readline() if len(res) > 0: print(res.decode('utf-8')) time.sleep(0.5) ``` ## 计算机硬盘修改数据的原理 ```python 硬盘写数据可以看作成是在硬盘刻字 一旦需要修改中间内容 则需要重新刻字 因为刻过的字不能从中间在分开 硬盘删除数据的原理 不是直接删除数据而是该变状态 等着后续数据的覆盖才会被真正删除 ``` ## 文件内容修改 ```python #方法1覆盖修改 with open(r'b.txt', 'r', encoding='utf8') as f1: res = f1.read().replace('111', '2222') with open(r'b.txt', 'w',encoding='utf8') as f2: f2.write(res) #修改文件内容方式:换地写 with open(r'b.txt', 'r', encoding='utf8') as f1,open(r'c.txt', 'w',encoding='utf8') as f2: for i in f1: f2.write(i.replace('222','qwe')) import os os.remove(r'b.txt') os.rename('c.txt','b.txt') ``` ## 作业 ```python ''' 1.编写简易版本的拷贝工具 自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径 任何类型数据皆可拷贝 ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可 ''' # old_file_path = input('需要拷贝的文件路径') # new_file_path = input('需要拷贝到的文件路径') # # 第一种方法 # # with open(fr'{old_file_path}', 'rb') as f1, open(fr'{new_file_path}', 'wb') as f2: # # f2.write(f1.read()) # 第二种 # import os # with open(fr'{old_file_path}', 'rb') as f1: # data = f1.read() # with open(fr'aa.txt','wb') as f2: # f2.write(data) # os.remove(fr'{old_file_path}') # os.rename(fr'aa.txt',fr'{new_file_path}') ''' 2.利用文件充当数据库编写用户登录、注册功能 文件名称:userinfo.txt 基础要求: 用户注册功能>>>:文件内添加用户数据(用户名、密码等) 用户登录功能>>>:读取文件内用户数据做校验 ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息 拔高要求: 用户可以连续注册 用户可以多账号切换登录(多用户) 文件内有多个用户信息 ps:思考多用户数据情况下如何组织文件内数据结构较为简单 提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件 ''' while True: print(''' 1.注册 2.登录 ''') input_num = input('请输入编号') import os if not os.path.exists(r'a.txt'): open('a.txt','w').close() if input_num == '1': with open(r'a.txt', mode='r', encoding='utf-8') as f1: while True: name = input('用户名q') if name.upper() == "Q": break pwd = input('密码') for i in f1: if name in i: print(f'{name}用户名存在') break else: with open(r'a.txt',mode='a',encoding='utf-8') as f2: f2.write(f'{name}|{pwd}\n') print(f'{name}注册成功') elif input_num == '2': with open(r'a.txt', mode='r', encoding='utf-8') as f1: while True: name = input('用户名') if name.upper() == 'Q': break pwd = input('密码') for i in f1: data = i.split('|')[0] if name == i.split('|')[0] and pwd == i.split('|')[1].strip(): print(f'{name}登录成功') break else: print('登录失败') else: print('输入有误请重新输入') ``` Last modification:October 9th, 2022 at 04:00 pm © 允许规范转载 Support 如果觉得我的文章对你有用,请随意赞赏 ×Close Appreciate the author Sweeping payments
Comment here is closed