文件的处理
1、什么是文件 文件就是操作系统提供给应用程序来操作硬盘的虚拟的概念 2、为什么要用文件 因为人类和计算机要永久保存数据 3、怎么用文件 采用:open() 相对路径:a.txt # 必须与当前py文件在同一级目录 #### 一般建议多用相对路径 绝对路径:D:\项目路径\python13期\day07\a.txt 本机保存的位置 """ 文件上下文: f= open('文件路径','打开文件模式','指定支付的编码') # f = open("a.txt") 用这个来用文件 # # print(f.readable()) # 判断当前文件是否可读 # print(f.writable()) # 判断当前文件是否可写 以下记得添加 # # del f # 回收变量资源 # f.close() # 回收操作系统的资源 with 自动帮你回收操作系统的资源 del f 需要自己自己加上 # with open(r"my testing.py",mode = 'r',encoding= 'utf-8') as f: # # print(f.read()) # # prinf = open("E:\PycharmProjects\study\my testing.py") # # print(f.readable()) # # print(f.writable()) # # print(f)t(f.readline()) # print(f.readlines()) # r:防止转义 防止出现不必要的信息 影响运行 举例如下 # with open(r'D:\项目路径\python13期\day07\a.txt')as f: # print(f.read()) # 读取文件 打开文件的三种模式: r : 1、只读 2、如果文件不存在,会报错 w:(慎用) 1、只写 2、如果文件不存在,则新建一个文件写入数据 3、如果文件内存在数据,会将数据清空,重新写入 a: 1、追加写 2、如果文件内存在数据,会在已有数据的后面追加数据 3、如果文件不存在,则新建一个文件写入数据 r: with open(r"my testing.py",mode = 'r',encoding= 'utf-8') as f: print(f.read()) print(f.readline()) print(f.readlines()) w with open(r'my testi.py',mode = 'w',encoding = "utf-8") as f: f.write('meihao shijie 世界之大') f.writelines(['meihaoshijie\n women de guojia'])文本模式 a with open(r'my testi.py', mode='a', encoding="utf-8") as f: f.write('zhege shiie 非常的美好 这个是字符串') 控制文件读写内容的处理模式 tb模式不能单独使用,必须与r/w/a之一结合使用 t 默认的是:文本模式 1.读写文件都是以字符串为单位的; 2.只能针对文本文件; 3.必须指定encoding参数。 b:二进制模式: 1.读写文件都是以bytes/二进制为单位的; 2.针对所有文件; 3.一定不能指定encoding参数。 b with open(r'E:\PycharmProjects\study\my testing.py',mode ='rb') as f: print(f.read()) with open(r'E:\PycharmProjects\study\.idea\11.jpg', mode='rb') as rf,\ open(r'ling.png', mode='wb') as wf: ling = rf.read() wf.write(ling) 文件处理的内置方法: 读: f.read() #读文本:一次性独处所有的数据; f.readline()# 一次只读一行 f.readlines()# 将数据全部读入内存,以换行符分隔,存入列表。 写 f.write()#写文件 f.writeable #是否可写 f.writelines()#for + f.write() # inp_name = input('请输入你的名字:').strip() # inp_pwd = input('请输入你的密码:').strip() # with open(r'aaa.txt','r',encoding = 'utf-8') as f: # for line in f: # u,p = line.strip('\n').split(' ') ###解压赋值 # if inp_name == u and inp_pwd == p: # print('登录成功') # else: # print('账号名或者密码错误')
‘+’的模型
1、其他的文件模式 r+ w+ a+ ps:都说可读可写,而且带着原来的特性 一般是不用的 with open(r'aaa.txt','r+',encoding = 'utf-8') as f: print(f.read()) f.write('在那个地方') >>>>>>> 我们都会阿豪都爆破包租婆 在那个地方在那个地方
光标的移动
f.seek(offset,whence) offset: 相对偏移度 (光标移动的位数)针对的是字节 whence:指定光标位置从何开始 0:从文件开头 t,b都是可以的 1:从当前位置 b是可以的 2:从文件末尾 b是可以的 1,2 也可以使用,但是光标不能移动 ### 相对偏移度始终为“0” f.read() 读出文件所有内容 文件过大,会造成内存溢出 f.read('int类型的参数') ps: rt:针对的就是字符 rb:针对的是字节 utf-8: 中文是3个bytes 英文是1个bytes gbk: 中文的是2个bytes 英文的半角是1个bytes 全角的是2个bytes aaa.txt :我们都会阿豪都爆破包租婆 t with open(r'aaa.txt','rt',encoding = 'utf-8') as f: f.seek(3,0) print(f.tell()) #查询当前的指针位置 print(f.read(2)) >>>>>>> 3 们都 ###1,2 也可以使用,但是光标不能移动 ### 相对偏移度始终为“0”#### with open(r'aaa.txt','rt', encoding = 'utf-8') as f: f.seek(-3, 2) #报错 光标不能移动 print(f.tell()) print(f.read(2)) >>>>>>> Traceback (most recent call last):报错 File "E:/PycharmProjects/study/11.8.py", line 72, in <module> f.seek(-3, 2) io.UnsupportedOperation: can't do nonzero end-relative seeks 不报错的操作 with open(r'aaa.txt','rt', encoding = 'utf-8') as f: f.seek(0, 2) ###相对的便宜度为“0” print(f.tell()) print(f.read(2)) >>>>>>>> 我们 6
检测文件是否发生变化
1、通过f.seek(0,2),将光标移动到文件末尾 2、通过while循环,让文件保持打开状态 1、通过f.readline(),获取当前光标所在行的内容 2、通过if判断,是否获取到数据,获取到数据,说明,文件被改动 3、print
获取文件的实时监控
import time ###定义的函数 res = time.strftime('%Y-%m-%d %H:%M:%S') with open(r'aaa.txt','a',encoding = 'utf-8') as f: f.write(f'{res} 马上就要学函数了,加油\n') 下面是实时监控的编程 with open(r'aaa.txt','r',encoding = 'utf=8') as f: f.seek(0,2) while True: res = f.readline() if res: print(f'录入记录:{res}')
文件的修改
一种方法 with open(r'name.txt','r',encoding = 'utf-8') as f: data = f.read() #print(data) with open(r'name.txt','w',encoding = 'utf-8') as f: res = data.replace('tank','DSB') print(f.write(res)) >>>>>>> sean 是DSB, Sean是非常大的DSB,Sean和他们的同事都是非常大的DSB! 另外一种方法 这种方法是新建一个文本替代旧的文本,来操作 优先考虑这种 import os with open(r'aaa.txt','r',encoding = 'utf-8') as rf, open(r'b.txt','w',encoding = 'utf-8') as wf: data = rf.read() res = data.replace('关键','好好') wf.write(res) os.remove(r'aaa.txt') os.rename('aaa.txt','b.txt') 4、文件修改: 1、将数据一次性全部读入内存,在内存修改该数据, 写入原文件 优点: 从始至终只有一个文件 缺点: 如果文件过大,会造成内存溢出 2、使用两个文件,将原文件的数据一行行读到内存,修改之后写入新文件, 通过os模块,将原文件删除,将新文件名称改查原文件 优点: 从始至终,内存中只有一行数据 对内存的压力小 缺点: 通过两个文件来实现的
文本:我们是虚构好过航空你看过 截断 with open(r'aaa.txt','r+',encoding = 'utf-8') as f: f.truncate(6) # 这个操作截断的功能 print(f.read()) # f.seek(-3,2) # print(f.tell()) >>>>>> 我们 f.flush() # 将内存中数据刷到硬盘