文件内光标的移动
"""
with open(r'aaa.txt', 'r', encoding='utf8') as f:
data = f.read(3) # a你好
print(data)
在文本模式下read括号内的数字表示读取几个字符
with open(r'aaa.txt', 'rb') as f:
data = f.read(4) # a你
print(data.decode('utf8'))
在二进制模式下read括号内的数字表示读取几个字节(英文一个字节 中文三个字节)
tell() 获取光标移动的字节数
seek(offset,whence)
offset 控制光标移动的位移量(字节)
whence 模式
0 基于文件开头移动多少字节
1 基于光标当前所在位置移动多少字节
2 基于文件末尾移动多少字节
ps:1和2只能在二进制模式下使用 0无所谓
"""
import time
with open('access.log', 'rb') as f:
f.seek(0, 2)
while True:
line = f.readline()
if len(line) == 0:
time.sleep(0.5)
else:
print(line.decode('utf-8'), end='')
文件内数据修改
"""
机械硬盘存储数据的原理
1.数据的修改 其实是覆盖写
2.数据的删除 占有态自由态
"""
代码修改文件的方式
1.覆盖写
先读取文件内容到内存 在内存中完成修改 之后w模式打开该文件写入
2.重命名
先读取文件内容到内存 在内存中完成修改 之后保存到另外一个文件中
再将原文件删除 将新的文件重命名为原文件
"""
优点:硬盘只占用一块空间
缺点:数据量较大的时候会造成内存溢出
"""
import os
with open('demo.txt', 'r', encoding='utf8') as read_f, \
open('.demo.txt.swap', 'w', encoding='utf8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('NB', 'SB'))
os.remove('demo.txt')
os.rename('.demo.txt.swap', 'demo.txt')
"""
优点:不会造成内存溢出
缺点:有那么一段时间需要占用硬盘两个地方的空间(可能) 也可能是在内存中创建没有刷到硬盘
"""