2012-05-28 55 views
1

我正在学习PyGTK和我正在做一个文本编辑器(这似乎是pygtk你好世界:)) 无论如何,我有一个“保存”功能,写入TextBuffer到文件。看起来像Python打开()模式和文件写作

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..." 
    ...... 

基本上,如果该文件存在,写入缓冲区,如果不是弹出另存为对话框。

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

在此先感谢!

回答

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..." 
    ...... 

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

+0

f.truncate()为我做了。 –

0

以列表形式读取文件,在其开头添加一个元素,全部写出。像这样的东西。

f = open(self.working_file_path, "r+") 
flist = f.readlines() 
flist.insert(0, self._get_text()) 
f.seek(0) 
f.writelines(flist) 
+3

你应该在这样的代码中真正使用'with'语法。 – Voo

+0

-1我得到'IOError [Errno 9]错误的文件描述符。 –

+0

我认为这是因为我复制了OP的rw +而不是r +。固定。 – sajattack

6

可以"r+"模式,它允许您读取和写入文件打开一个文件,并寻求到特定位置,写有。这可能不会帮助你做我认为你想要的东西;这听起来像你只想写出已更改的数据?

请记住,在磁盘上文件不是作为一系列可扩展行存储的,它只是一个字节序列;其中一些字节表示行尾,但下一行紧跟着。所以,如果你编辑文件中的第一行,并且写出新的第一行,除非新的一行正好是正好是长度与旧的一样,第二行现在不会在正确的位置,所以您需要将其移动(并且如果您写出的新行比原始行更长,则先将其复制一份)。现在这意味着下一行不在正确的位置......等等,直到你必须读入并写出文件的全部剩余部分。

在实践中,除非可以简单追加更多数据,否则几乎不会写入现有文件的一部分;如果你需要“修改”你读入的文件,修改它在内存中,并将其写回你在文件中分段读取(通常是逐行),然后写出一个新文件文件当你去(然后可能将新文件移动到原始顶部)。第一种方法最简单,第二种方法更好,因为不需要一次把所有东西都记忆在内存中。

+0

很好的解释! –