撤消写入文件的最佳方法是什么?如果我正在经历一个循环并一次写一行,并且我想撤消先前的写入并用其他内容替换它,我该怎么做呢?有任何想法吗?
提前致谢!
正如其他人所指出的那样,这没有多大意义,除非你不得不写,否则最好不要写。在您的情况下,您可以将“写入指针”保留在处理后面一行。
伪代码:
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()
在重写之前对其进行操作。起初,编码似乎更简单,但调试起来却是一场噩梦。
如前所述,您最好不要尝试撤消写入。但是,如果您真的想这样做,那很容易:
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")
只需记录要回退到的文件位置,返回到该位置,然后将文件截断到该位置。
这样做的主要问题是它不适用于流。您不能对标准输出、管道或 TCP 流执行此操作;只到一个真实的文件。
尝试懒惰地写入文件:在您最终确定需要这样做之前不要写入。
如果您跟踪行号,则可以使用以下内容:
from itertools import islice
def seek_to_line(f, n):
for ignored_line in islice(f, n - 1):
pass # skip n-1 lines
f = open('foo')
seek_to_line(f, 9000) # seek to line 9000
# print lines 9000 and later
for line in f:
print line
也许更好的做法是修改您的程序,以便它只在您确定要编写它时才写一行。为此,您的代码将类似于:
to_write = ""
for item in alist:
#Check to make sure that I want to write
f.write(to_write)
to_write = ""
#Compute what you want to write.
to_write = something
#We're finished looping so write the last part out
f.write(to_write)