文件修改

硬盘的存储原理就是,当你把文件存到硬盘上,就在硬盘上划了一块空间,存数据,等你下次打开这个文件,会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
读取数据:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值