正如其他人指出,这并没有太大的意义,它远不如不写,直到你不得不这样做.在您的情况下,您可以将"书写指针"保持在处理后面一行.
伪代码:
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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,previousItem是唯一保留在内存中的项目,并根据需要更新为"累积".只有当下一个与那个"不相同"时才会写入文件.
当然,你可以真正回滚文件光标,只是跟踪最后一行开始的字节偏移,然后fseek()在重写之前做到那里.起初,编码似乎更简单,但这是调试的总噩梦.
如前所述,您最好不要尝试撤消写入。不过,如果你真的想这样做,那也很简单:
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")
Run Code Online (Sandbox Code Playgroud)
只需记录要倒回的文件位置,向后查找,然后将文件截断到该位置即可。
这样做的主要问题是它不适用于流。您不能对 stdout、管道或 TCP 流执行此操作;仅针对真实文件。