我正在学习PyGTK,我正在制作一个文本编辑器(这似乎是pygtk的hello世界:]) 无论如何,我有一个“保存”功能,将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..."
......
基本上,如果文件存在,请将缓冲区写入其中,如果没有调出另存为对话框。
我的问题是:“更新”文件的最佳方法是什么。我似乎只能附加到文件的末尾。我尝试过各种文件模式,但我确定我错过了一些东西。
提前致谢!
答案 0 :(得分:6)
您可以以"r+"
模式打开文件,该模式允许您读取和写入文件,并寻找特定位置并在那里写入。这可能不会帮助你做我认为你想要的事情;听起来你只想写出改变后的数据?
请记住,在磁盘上文件不是作为一系列可扩展的行存储的,它只是一个字节序列;其中一些字节表示行结尾,但下一行会立即跟进。因此,如果您编辑文件中的第一行并编写新的第一行,除非新的完全与旧版本的长度相同,否则第二行现在将不在正确的地方,所以你需要移动它(如果你写出的新行比原来的长,那么首先要复制它)。现在这意味着下一行也不在正确的位置......等等,直到您必须读入并写出文件的其余部分。
在实践中,除非您只是追加更多数据,否则几乎不会只写一部分现有文件;如果您需要“更改”您读入的文件,请在内存中更改它,并将其写回或您在文件中逐段读取(通常是逐行),然后写出来一个新文件(然后可能将新文件移到原始文件的顶部)。第一种方法最简单,第二种方法更好,不必一次将整个内容保存在内存中。
答案 1 :(得分:3)
在您写入文件的位置,您的位置位于文件的末尾,因此您需要回头查看。然后,您将覆盖该文件,但这可能会在最后留下旧内容,因此您还需要截断该文件。
此外,您指定的模式('rw+'
)无效,当我尝试对使用它打开的文件执行某些操作时,我会收到IOErrors。我相信您需要模式'r+'
(“Open for reading and writing。该流位于文件的开头。”)。 '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都是从打开调用中出现的非文件错误。
答案 2 :(得分:0)
以列表形式读取文件,在其开头添加元素,将其全部写出来。这样的事情。
f = open(self.working_file_path, "r+")
flist = f.readlines()
flist.insert(0, self._get_text())
f.seek(0)
f.writelines(flist)