文件的修改/作业
# 文件a.txt内容如下
张三三 江苏 199 49
李思思 广西 222 57
王捂捂 山西 333 62
# 执行操作
with open('a.txt',mode='r+t',encoding='utf-8') as f:
f.seek(9)
f.write('<广义相对>')
# 文件修改后的内容如下
张三<广义相对> 江苏 199 49
李四 广西 222 57
王五 山西 333 62
# 强调:
# 1、硬盘空间是无法修改的,硬盘中数据的更新都是用新内容覆盖旧内容
# 2、内存中的数据是可以修改的
- 文件对应的是硬盘空间,硬盘不能修改对应着文件本质也不能修改, 那我们看到文件的内容可以修改,是如何实现的呢?
- 大致的思路是将硬盘中文件内容读入内存,然后在内存中修改完毕后再覆盖回硬盘 具体的实现方式分为两种:
##一
# 将文件内容发一次性全部读入内存,然后在内存中修改完毕后再覆盖写回原文件
# 优点: 在文件修改过程中同一份数据只有一份
# 缺点: 会过多地占用内存
with open('db.txt',mode='rt',encoding='utf-8') as f:
data=f.read()
with open('db.txt',mode='wt',encoding='utf-8') as f:
f.write(data.replace('kevin','SB'))
##二
# 以读的方式打开原文件,以写的方式打开一个临时文件,一行行读取原文件内容,修改完后写入临时文件...,删掉原文件,将临时文件重命名原文件名
# 优点: 不会占用过多的内存
# 缺点: 在文件修改过程中同一份数据存了两份
import os
with open('bb.txt',mode='rt',encoding='utf-8') as read_f,\
open('.bb.txt.swap',mode='wt',encoding='utf-8') as wrife_f:
for line in read_f:
wrife_f.write(line.replace('sb','suaige'))
os.remove('bb.txt')
os.rename('.bb.txt.swap','bb.txt')
use_file = input("输入文件路径:").strip()
new_file = input("输入新文件路径:").strip()
with open('{}'.format(new_file), mode="rb") as f1, \
open('{}'.format(new_file), mode="wb") as f2:
for line in f1:
f2.write(line)
基于seek控制指针移动,测试r+、w+、a+模式下的读写内容
with open("b.txt","r+",encoding="utf-8") as f :
print(f.read())
f.seek(5,0)
print(f.tell())
f.write("bbb")
print(f.read())
with open("b.txt",wr+",encoding="utf-8") as f :
print(f.read())
f.seek(5,0)
print(f.tell())
f.write("bbb")
print(f.read())
with open("b.txt","a+",encoding="utf-8") as f :
print(f.read())
f.seek(5,0)
print(f.tell())
f.write("bbb")
print(f.read())
import time
with open('access.log', 'rt', encoding='utf-8') as f:
f.seek(0, 2)
while True:
res = f.readline()
if not res:
time.sleep(0.5)
continue
print(res)

浙公网安备 33010602011771号