Python: 撤销文件写入

3 投票
5 回答
4927 浏览
提问于 2025-04-15 14:36

怎么才能撤销对文件的写入呢?假设我在一个循环里,一次写一行,如果我想撤销之前写的内容,并用其他内容替换掉,那我该怎么做呢?有没有什么好主意?

提前谢谢你们!

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() 移动到那里。一开始看起来这样编码会简单一些,但调试起来会非常麻烦。

撰写回答