1

我正在学习 PyGTK,我正在制作一个文本编辑器(这似乎是 pygtk 的世界:]) 无论如何,我有一个“保存”功能,可以将 TextBuffer 写入文件。看起来像

try:
    f = open(self.working_file_path, "rw+")
    buff = self._get_buffer()
    f.write(self._get_text())
    #update modified flag
    buff.set_modified(False)
    f.close()

except IOError as e:
    print "File Doesnt Exist so bring up Save As..."
    ......

基本上,如果文件存在,则将缓冲区写入其中,如果不存在,则打开另存为对话框。

我的问题是:“更新”文件的最佳方式是什么。我似乎只能附加到文件的末尾。我尝试了各种文件模式,但我确定我错过了一些东西。

提前致谢!

4

3 回答 3

6

可以在模式下打开文件"r+",该模式允许您读取和写入文件,并寻找特定位置并在那里写入。不过,这可能无法帮助您做我认为您想要的事情;听起来您只想写出更改的数据?

请记住,文件在磁盘上不是存储为一系列可扩展的行,它只是一个字节序列;其中一些字节表示行尾,但下一行紧随其后。因此,如果您编辑文件中的第一行并写出新的第一行,除非新行的长度与旧行的长度完全相同,否则第二行现在将不在正确的位置,所以您需要移动它(如果您写出的新行比原来的长,请先复制它)。现在这意味着下一行也不在正确的位置......依此类推,直到您必须读入并写出文件的整个其余部分。

实际上,除非您可以简单地追加更多数据,否则您几乎不会只写入现有文件的一部分;如果您需要“更改”您读入的文件,请在内存中对其进行更改,然后将其写回,或者您分段读取文件(通常是逐行),然后随时写入文件(然后可能将新文件移动到原始文件的顶部)。第一种方法最简单,第二种方法更好,因为不必一次将整个内容保存在内存中。

于 2012-05-28T23:49:53.473 回答
3

在您写入文件的位置,您的位置在文件的末尾,因此您需要回到开头。然后,您将覆盖该文件,但这可能会在最后留下旧内容,因此您还需要截断该文件。

此外,您指定的模式 ( 'rw+') 无效,当我尝试对使用它打开的文件执行一些操作时,我得到 IOErrors。我相信您想要模式'r+'打开以进行读写。流位于文件的开头。”)。 'w+'类似,但如果文件不存在,则会创建该文件。

所以,你正在寻找的可能是这样的代码:

try:
    f = open(self.working_file_path, "r+")
    buff = self._get_buffer()
    f.seek(0)
    f.truncate()
    f.write(self._get_text())
    #update modified flag
    buff.set_modified(False)
    f.close()

except IOError as e:
    print "File Doesnt Exist so bring up Save As..."
    ......

但是,您可能希望修改此代码以在截断和写入文件时正确捕获和处理错误,而不是假设本节中的所有 IOErrors 都是来自调用 open 的不存在文件错误。

于 2012-05-28T23:56:54.103 回答
0

将文件作为列表读入,在其开头添加一个元素,然后将其全部写出。像这样的东西。

f = open(self.working_file_path, "r+")
flist = f.readlines()
flist.insert(0, self._get_text())
f.seek(0)
f.writelines(flist)
于 2012-05-28T23:28:33.177 回答