硬盘的存储原理就是,当你把文件存到硬盘上,就在硬盘上划了一块空间,存数据,等你下次打开这个文件,会seek到一个位置,每改一个字,就是把原来的覆盖掉,如果要插入,是不可能的,因为后面的数据在硬盘上不会整体向后移动,所以就会出现当前这个情况,你要插入,却变成把旧内容覆盖掉。
所以修改文件,就不要在硬盘上修改,把内容全部读到内存里,数据在内存里可以随便增删改查,修改之后,把内容全部写回硬盘,把原来的数据全部覆盖掉。
当然了,如果有些文件特别大,比如5G,那么一下吃掉这么大内存,非常浪费资源,所以更好的方法就是,如果不像占内存,那么就边读边写,也就是不修改源文件,但是可以打开丢文件的同时,生成一个新文件,边从旧的里面读,边往新的里面写,遇到需要修改的就改了再写道新文件,这样在内存里面一直只存一行内容,就不占内存了,但是也有一个缺点就是,虽然不占内存,但是占硬盘,每次修改,都要生成一份新文件,虽然改完后,可以把旧的覆盖掉,但是在改的过程中,还是有两份数据
文件修改占硬盘
代码:
f_name= 'file.txt'
f_new_name = 'file_new.txt'
old_str = '123'
new_str = '123123123'
f = open(f_name,'r',encoding='gbk')
f_new = open(f_new_name,'w',encoding='gbk')
for line in f:
if old_str in line:
line = line.replace(old_str,new_str)
f_new.write(line)
f.close()
f_new.close()
上面的代码会生成一个修改后的新文件,源文件不动,若想覆盖源文件
代码如下:
import os
os.replace(file_new_name,file_name)
文件修改占内存
这样不需要占用两个文件,只需要写一个文件,直接r+就可以,但是会出现一个问题,就是要是以前文件内容多,现在少了,那会出错,为了避免这种错误的发生,使用truncate()就ok
userinfo.txt的内容:
1:www.baidu.com
2:www.google.com
3:www.tencent.com
4:www.tianmao.com
5:www.jingdong.com
f.truncate([size])
把文件裁成规定的大小,默认的是裁到当前文件操作标记的位置。
如果size比文件的大小还要大,依据系统的不同可能是不改变文件,
也可能是用0把文件补到相应的大小,也可能是以一些随机的内容加上去。
file = open('userinfo.txt','r+',encoding='utf-8')
print('文件名为:',file.name)
line =file.readline()
print('读取第一行:%s' %line)
#截断剩下的字符串
file.truncate()
#尝试再次读取数据
line =file.readline()
print('读取数据:%s' %line)
file.close()
# 结果:
# 文件名为: userinfo.txt
# 读取第一行:1:www.baidu.com
#
# 读取数据:2:www.google.com
file = open('userinfo.txt','r+',encoding='utf-8')
print('文件名为:',file.name)
line =file.readline()
print('读取第一行:%s' %line)
#截断10的字符串
file.truncate(10)
#尝试再次读取数据
line =file.readline()
print('读取数据:%s' %line)
file.close()
结果:
文件名为: userinfo.txt
读取第一行:1:www.baid
读取数据: