有一个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
文件比较小以r方式读出全部,修改后再以w方式写入可以。
但文件很大时,不能全部读入变量中有什么好的方法?
#3
读写可以同时进行,你不需要整个文件读入变量中,逐行操作即可...
#4
怎样同时进行?
以r方式打开?在上面write的位置再用w方式打开?达不到想要的效果吧。
以w方式打开时,会隐含一个close的动作。
#5
都说了w是个新文件,跟你的读的文件没关系...
#6
每读一句写到一个新文件中,直到遇到要修改的行,然后修改后写到新文件。最后用新文件覆盖原来的文件。
100M的文件只插入几个字节,就要全部重写一遍。感觉应该有更好的方式。
#7
也许吧,不过弄出个单一100M的文本还要能随机修改,本身设计就是个问题...
#8
读写以当前文件指针为准,每次读写后指针都会自动调整,除非你手动调整文件指针,同时保证不要无意覆盖了其他文件内容。
貌似编辑器基本以内存行为单位修改/替换,然后按需全部回写到磁盘文件吧
貌似编辑器基本以内存行为单位修改/替换,然后按需全部回写到磁盘文件吧
#9
你想在 333 后插入内容,原本在 333后面的东西的偏移量都要发生变化,目前想到的解决方法和 angel_su 的一致。继续围观看有没有好的办法
#10
看来也就这样了。结贴。
#11
这种需求就用sqlite吧 ?
#12
这种需求,直接awk
#1
貌似写文件没有所谓插入,只能是覆盖动作,所以用r+读写只能是等量替换或尾部附加。增添删除的情况一般就是简单只读打开原文件过滤处理,另外用w模式建立一个新文件写入,最后删掉原文件,新文件用原文件名重命名...
#2
文件比较小以r方式读出全部,修改后再以w方式写入可以。
但文件很大时,不能全部读入变量中有什么好的方法?
#3
读写可以同时进行,你不需要整个文件读入变量中,逐行操作即可...
#4
怎样同时进行?
以r方式打开?在上面write的位置再用w方式打开?达不到想要的效果吧。
以w方式打开时,会隐含一个close的动作。
#5
都说了w是个新文件,跟你的读的文件没关系...
#6
每读一句写到一个新文件中,直到遇到要修改的行,然后修改后写到新文件。最后用新文件覆盖原来的文件。
100M的文件只插入几个字节,就要全部重写一遍。感觉应该有更好的方式。
#7
也许吧,不过弄出个单一100M的文本还要能随机修改,本身设计就是个问题...
#8
读写以当前文件指针为准,每次读写后指针都会自动调整,除非你手动调整文件指针,同时保证不要无意覆盖了其他文件内容。
貌似编辑器基本以内存行为单位修改/替换,然后按需全部回写到磁盘文件吧
貌似编辑器基本以内存行为单位修改/替换,然后按需全部回写到磁盘文件吧
#9
你想在 333 后插入内容,原本在 333后面的东西的偏移量都要发生变化,目前想到的解决方法和 angel_su 的一致。继续围观看有没有好的办法
#10
看来也就这样了。结贴。
#11
这种需求就用sqlite吧 ?
#12
这种需求,直接awk