[求助]python如何修改文件内容

时间:2021-10-16 00:05:25
感觉是个很基本的功能,但我实际使用时发现并不那么简单。
有一个num.txt文件,内容如下:
1
22
333
4444
55555

我希望在333这行之后插入一个字符串,代码如下:
import os
filename = open("num.txt","r+")
addstr="test str"
for line in filename:
    if line.strip().startswith("33"):
        filename.write(addstr)
filename.close
结果是在文件末尾写入了很多内容。(如果只写入addstr还容易理解)
我在这里是学习用的程序。是想搞明白有些问题:
1.是否使用for …… in 这种方式,无法用filename.write方式插入内容。
2.在文件中间插入一行,应该如何定位、插入。
3.r+方式打卡文件是否合适。因为w方式打开文件会无法读取文件内容。

12 个解决方案

#1


貌似写文件没有所谓插入,只能是覆盖动作,所以用r+读写只能是等量替换或尾部附加。增添删除的情况一般就是简单只读打开原文件过滤处理,另外用w模式建立一个新文件写入,最后删掉原文件,新文件用原文件名重命名...

#2


引用 1 楼  的回复:
貌似写文件没有所谓插入,只能是覆盖动作,所以用r+读写只能是等量替换或尾部附加。增添删除的情况一般就是简单只读打开原文件过滤处理,另外用w模式建立一个新文件写入,最后删掉原文件,新文件用原文件名重命名...


文件比较小以r方式读出全部,修改后再以w方式写入可以。
但文件很大时,不能全部读入变量中有什么好的方法?

#3


读写可以同时进行,你不需要整个文件读入变量中,逐行操作即可...

#4


引用 3 楼  的回复:
读写可以同时进行,你不需要整个文件读入变量中,逐行操作即可...

怎样同时进行?
以r方式打开?在上面write的位置再用w方式打开?达不到想要的效果吧。
以w方式打开时,会隐含一个close的动作。

#5


都说了w是个新文件,跟你的读的文件没关系...

#6


引用 5 楼  的回复:
都说了w是个新文件,跟你的读的文件没关系...

每读一句写到一个新文件中,直到遇到要修改的行,然后修改后写到新文件。最后用新文件覆盖原来的文件。
100M的文件只插入几个字节,就要全部重写一遍。感觉应该有更好的方式。

#7


也许吧,不过弄出个单一100M的文本还要能随机修改,本身设计就是个问题...

#8


读写以当前文件指针为准,每次读写后指针都会自动调整,除非你手动调整文件指针,同时保证不要无意覆盖了其他文件内容。
貌似编辑器基本以内存行为单位修改/替换,然后按需全部回写到磁盘文件吧

#9


你想在 333 后插入内容,原本在 333后面的东西的偏移量都要发生变化,目前想到的解决方法和 angel_su 的一致。继续围观看有没有好的办法

#10


看来也就这样了。结贴。

#11


这种需求就用sqlite吧 ?

#12


这种需求,直接awk

#1


貌似写文件没有所谓插入,只能是覆盖动作,所以用r+读写只能是等量替换或尾部附加。增添删除的情况一般就是简单只读打开原文件过滤处理,另外用w模式建立一个新文件写入,最后删掉原文件,新文件用原文件名重命名...

#2


引用 1 楼  的回复:
貌似写文件没有所谓插入,只能是覆盖动作,所以用r+读写只能是等量替换或尾部附加。增添删除的情况一般就是简单只读打开原文件过滤处理,另外用w模式建立一个新文件写入,最后删掉原文件,新文件用原文件名重命名...


文件比较小以r方式读出全部,修改后再以w方式写入可以。
但文件很大时,不能全部读入变量中有什么好的方法?

#3


读写可以同时进行,你不需要整个文件读入变量中,逐行操作即可...

#4


引用 3 楼  的回复:
读写可以同时进行,你不需要整个文件读入变量中,逐行操作即可...

怎样同时进行?
以r方式打开?在上面write的位置再用w方式打开?达不到想要的效果吧。
以w方式打开时,会隐含一个close的动作。

#5


都说了w是个新文件,跟你的读的文件没关系...

#6


引用 5 楼  的回复:
都说了w是个新文件,跟你的读的文件没关系...

每读一句写到一个新文件中,直到遇到要修改的行,然后修改后写到新文件。最后用新文件覆盖原来的文件。
100M的文件只插入几个字节,就要全部重写一遍。感觉应该有更好的方式。

#7


也许吧,不过弄出个单一100M的文本还要能随机修改,本身设计就是个问题...

#8


读写以当前文件指针为准,每次读写后指针都会自动调整,除非你手动调整文件指针,同时保证不要无意覆盖了其他文件内容。
貌似编辑器基本以内存行为单位修改/替换,然后按需全部回写到磁盘文件吧

#9


你想在 333 后插入内容,原本在 333后面的东西的偏移量都要发生变化,目前想到的解决方法和 angel_su 的一致。继续围观看有没有好的办法

#10


看来也就这样了。结贴。

#11


这种需求就用sqlite吧 ?

#12


这种需求,直接awk