Python open()模式和文件编写

时间:2012-05-28 23:21:23

标签: python pygtk

我正在学习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..."
    ......

基本上,如果文件存在,请将缓冲区写入其中,如果没有调出另存为对话框。

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

提前致谢!

3 个答案:

答案 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)