Python: 撤销文件写入
怎么才能撤销对文件的写入呢?假设我在一个循环里,一次写一行,如果我想撤销之前写的内容,并用其他内容替换掉,那我该怎么做呢?有没有什么好主意?
提前谢谢你们!
5 个回答
4
尽量“懒惰”地写文件:在你确定真的需要写的时候再去写。
5
如前所述,最好不要尝试撤销写入的操作。如果你真的想这么做,其实也很简单:
import os
f = open("test.txt", "w+")
f.write("testing 1\n")
f.write("testing 2\n")
pos = f.tell()
f.write("testing 3\n")
f.seek(pos, os.SEEK_SET)
f.truncate(pos)
f.write("foo\n")
只需记录下你想要回退到的文件位置,然后回到那个位置,并把文件截断到那个位置。
不过,这样做的一个主要问题是,它不适用于流。你不能对标准输出(stdout)、管道或TCP流这样做;只能对真正的文件进行操作。
5
正如其他人提到的,这样做其实没什么意义,最好是在必须写的时候再写。在你的情况下,可以让“写指针”比处理的内容晚一行。
伪代码:
previousItem = INVALID
for each item I:
is I same as previousItem?
then update previousItem with I
else
write previousItem to file
previousItem = I
write previousItem to file
如你所见,previousItem
是唯一保存在内存中的项目,它会根据需要进行更新,以便“累积”信息。只有当下一个项目和这个项目不一样时,才会写入文件。
当然,你也可以真的把文件指针回滚,只需记录最后一行开始的字节偏移量,然后在重写之前用 fseek()
移动到那里。一开始看起来这样编码会简单一些,但调试起来会非常麻烦。