文件内指针移动是以字节位单位的,唯独t模式下的read读取的内容个数是以字符为单位的
f.read(3)
rt读 指针指向开头 读取汉字
with open(r'.txt',mode='rt',encoding='utf-8') as f:
res=f.read(3)#从头开始读读三个字符
print(res)
rb读 指针指向开头 读取byte 3个byte就是一个汉字
with open(r'.txt',mode='rb') as f:
res=f.read(3)
print(res.decode('utf-8'))
f.seek(指针移动的字节数,模式控制):控制文件指针的移动
模式控制:
0:默认模式,该模式代表指针移动的字节数是文件以开头为参照的
1:该模式代表指针移动的字节数是以当前所在的位置为参照的
2:该模式代表指针移动的字节数是以文件末尾的位置为参展的
强调:其中0模式可以在t或b模式使用,而1跟2模式只能在b模式下使用
f.tell()查看文件指针当前距离文件开头的位置
0模式详解:
with open('.txt',mode='rt',encoding='utf-8') as f:
f.seek(4, 0)
print(f.tell())
print(f.read())
在b模式的0模式读取文件内容
with open('.txt',mode='rb') as f:
f.seek(4, 0)
print(f.tell())
print(f.read().decode('utf-8'))
1模式详解:
with open('.txt',mode='rb') as f:
f.seek(3,1)
print(f.tell())
f.seek(4,1)
print(f.tell())
print(f.read().decode('utf-8'))
2模式详解
with open('.txt',mode='rb') as f:
f.seek(-9,2)#倒着读 2模式
data=f.read()
print(data.decode('utf-8'))
#tail -f access.log
文件里写日志
import time
#print(time.strftime('%Y-%m-%d %X'))
with open('a.txt',mode='at',encoding='utf-8') as f:
f.write('%s 下雨了
' %time.strftime('%Y-%m-%d %X'))
对文件的时时监控输出
with open('a.txt',mode='rb') as f:
f.seek(0,2)
while True:
line=f.readline()
if len(line)==0:
continue
else:
print(line.decode('utf-8'), end='')
须知一:
硬盘空间无法修改 硬盘中的数据更新都是用新的内容覆盖旧的内容
内存控制可修改
with open('.txt',mode='r+t',encoding='utf-8') as f:
f.seek(4,0)
print(f.tell())
f.write('我的')
内容直接覆盖 硬盘不能修改 都是用新的内容把原来之前的内容都覆盖掉
须知二:
文件对应的是硬盘空间,硬盘不能改应为文件本质也不能修改之所以我们看到文件的内容可以修改 是如何实现呢
大的思路:将硬盘中文件内容读入内存 然后再内存中修改完毕后再覆盖
具体实现方式分为两种
1.将文件内容一次性全部读入内存 然后在内存中修改完毕后再覆盖写回源文件
优点:在文件修改过程中同一份数据只有一份
缺点:如果文件够大会过多的占用内存
替换文件内容
with open('.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
with open('.txt',mode='wt',encoding='utf-8') as f:
f.write(data.replace('abc','sb'))
2.以读的方式打开原文件,以写的方式打开一个临时文件。。删掉原文件
优点:不会占用过多的内存
缺点:在文件修改过程中 同一份数据存了两份
import os
with open('.txt',mode='rt',encoding='utf-8') as read_f,open('1.txt',mode='wt',encoding='utf-8') as write_f:
for line in read_f:
write_f.write(line.replace('sb','abc'))
os.remove('.txt')
os.rename('1.txt','.txt')
文件过大用方式2 文件不大用方式1