3

撤消写入文件的最佳方法是什么?如果我正在经历一个循环并一次写一行,并且我想撤消先前的写入并用其他内容替换它,我该怎么做呢?有任何想法吗?

提前致谢!

4

5 回答 5

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()在重写之前对其进行操作。起初,编码似乎更简单,但调试起来却是一场噩梦。

于 2009-09-25T19:41:36.707 回答
4

如前所述,您最好不要尝试撤消写入。但是,如果您真的想这样做,那很容易:

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 流执行此操作;只到一个真实的文件。

于 2009-09-25T20:05:55.847 回答
4

尝试懒惰地写入文件:在您最终确定需要这样做之前不要写入。

于 2009-09-25T19:06:57.790 回答
0

如果您跟踪行号,则可以使用以下内容:

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 
于 2009-09-25T19:09:20.703 回答
0

也许更好的做法是修改您的程序,以便它只在您确定要编写它时才写一行。为此,您的代码将类似于:

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)
于 2009-09-25T19:11:08.700 回答