文件操作的其他模式补充
一、r+模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# with open(r'a.txt',mode='r+',encoding='utf-8') as f: # print(f.readable()) # True # print(f.writable()) # True # print(f.readline()) # 会将”a.txt“文件中的第一行内容打印出来 # f.write('我') # 会将”我“这个字添加到'a.txt'文件中内容中最后一个光标后面 # with open(r'a.txt',mode = 'r+b') as f: # print(f.readable()) # print(f.writable()) # # print(f.read()) # 打印出来的内容为’a.txt‘文件内容的字节符号 # res = f.read() # print(res.decode('utf-8')) # 将’a.txt‘的内容打印出来
二、w+模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# with open(r'a.txt',mode = 'w+',encoding = 'utf-8') as f: # print(f.readable()) # True # print(f.writable()) # True # f.write('活在梦里') # 会将该内容写入'a.txt'文件中,并且替换掉源文件的内容
三、a+模式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# with open(r'a.txt',mode = 'a+',encoding = 'utf-8') as f: # print(f.readable()) # True # print(f.writable()) # True # f.write('最好的我们') # 默认将该内容添加到'a.txt'文件的末尾
四、文件光标的移动
注意:
#在rt模式下,read内的数字表示的是字符的个数
#除此之外,数字表示的是字节
"""
f.seek(offset,whence)
offset:相对偏移量: 光标移动的位数
whence:
0:参照文件的开头 t和b都可以使用
1:参照光标所在的当前位置 只能在b模式下用
2:参照文件的末尾 只能在b模式下使用
"""
#0:参照文件开头 # with open(r"a.txt",mode = 'rt',encoding = 'utf-8')as f: # print(f.read(2)) # f.seek(10,0) # seek移动的是字节的个数 # print(f.read(3)) # f.seek(0,0) # 表示光标不移动 # print(f.read(9)) # 打印的是字符的个数 # with open(r'a.txt',mode = 'rb') as f: # print(f.read(3)) # 打印的为第一个中文的3个字节 # # # f.seek(6,0) # res = f.read(3) # print(res) # 打印出的为6个字节之后的3个字节 # print(res.decode('utf-8')) # 同上,只是转换成了字符
#1:参照光标所在的位置 # with open(r'a.txt',mode = 'rb') as f: # print(f.read(3).decode('utf-8')) # f.seek(7,1) # seek移动的是字节的个数 # print(f.read(1))
#2:参照文件的末尾 # with open(r'a.txt',mode = 'rb')as f: # print(f.read()) # f.seek(-3,2) # print(f.read().decode('utf-8')) # 打印出来的为末尾的三个字节符号
五、检测文件内容
with open(r'a.txt','rb') as f: # 先将光标移动到文件末尾 f.seek(0,2) while True: res = f.readline() # 查看光标移动了多少位 bytes # print(f.tell()) if res: print("新增的文件内容:%s"%res.decode('utf-8')) # 说明有人操作当前文件 # else: # # 说明文件没有被任何人操作 # print('暂无其他人操作该文件')
六、截断文件内容
with open(r'a.txt','a',encoding = 'utf-8') as f: f.truncate(3) # 接收字节的长度,必须为整型 #保留0~3的字节数,后面的全部删除
七、修改文件的两种方式
第一种方式:
# 先将数据由硬盘读到内存(读文件)
# 在内存中完成修改(字符串的替换)
# 再覆盖原来的内容(写文件)
with open(r'a.txt','r',encoding='utf-8') as f: data = f.read() print(data) # 读取该文件 with open(r'a.txt','w',encoding='utf-8') as f: res = data.replace('egon','jason') # 将该文件里指定的内容进行替换 f.write(res) # 将修改的内容写入
优点:任意时间硬盘上只有一个文件 不会占用过多硬盘空间
缺点:当文件过大的情况下,可能会造成内存溢出
第二种方式:
# 创建一个新文件
# 循环读取老文件内容到内存进行修改 将修改好的内容写到新文件中
# 将老文件删除 将新文件的名字改成老文件名
import os # 调用功能 with open(r'test02.txt','r',encoding='utf-8') as read_f,\ open(r'test02.swap','a',encoding='utf-8') as write_f: for line in read_f: # 取read_f 中的文件 new_line = line.replace('jason','egon') write_f.write(new_line) os.remove('testt02.txt') # 移除该文件 os.rename('test02.swap','test02.txt') # 重新命名
优点:内存中始终只有一行内容 不占内存
缺点:再某一时刻硬盘上会同时存在两个文件