文件操作模式补充
"+" 表示可以同时读写某个文件 r+, 读写【可读,可写】 w+,写读【可读,可写】 a+, 写读【可读,可写】
文件内光标移动
一: read(3): 1. 文件打开方式为文本模式时,代表读取3个字符 2. 文件打开方式为b模式时,代表读取3个字节 二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate 注意: 1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的 2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
检测文件内容
with open(r'test01.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'test','a',encoding='utf-8') as f: f.truncate(6) # 接收的字节的长度 整型 # 保留0~6字节数 后面的全部删除(截断)
修改文件
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
with open(r'test02.txt','r',encoding='utf-8') as f:
data = f.read()
print(data)
print(type(data))
with open(r'test02.txt','w',encoding='utf-8') as f:
res = data.replace('egon','jason')
print(data)
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:
new_line = line.replace('jason','egon')
write_f.write(new_line)
os.remove('test02.txt')
os.rename('test02.swap','test02.txt')
"""
优点:内存中始终只有一行内容 不占内存
缺点:再某一时刻硬盘上会同时存在两个文件
"""函数前戏
def用来定义函数,必须先定义后使用
函数名的命名规则跟变量名一模一样
定义的时候,只检测语法,不执行代码
#语法 def 函数名(参数1,参数2,参数3,...): '''注释''' 函数体 return 返回的值 #函数名要能见名知意
END