2012-05-28 111 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

很好的解釋! –