2017-05-17 40 views
1

我遇到了使用'with'打開文件的情況。如果更改成功,我對該文件進行一些編輯並保存。但是,無論何時在文件處理過程中發生錯誤,我都希望文件關閉而不對文件進行任何更改。與似乎覆蓋該文件,並使該文件爲空。發生錯誤時關閉文件而不保存 - Python

下面是代碼:

with open(path + "\\Config\\"+ filename, 'wb') as configfile: 
    config.write(configfile) 

我得到「是必需的對類字節對象,而不是‘STR’」誤差爲上述代碼這是好的。但發生錯誤時,文件中的所有內容都已刪除。

如何明確說明代碼不保存更改並恢復到更改前存在的內容?

我使用活性蟒3.5

回答

1

開啓在不同的模式中比w。如果它不存在,將使用'w'創建,否則它會截斷文件中的任何內容。改用'a',其中不是默認截斷。但是請注意,文件光標將位於文件的末尾。如果沒有錯誤,你實際上想要覆蓋,那麼必須手動輸入f.seek(0),然後f.truncate()

編輯

事實上,它可能是最好使用r+,不會截斷自動兩種,流是在文件而不是結束的開始(就像它與'a')所以只需要簡單的f.truncate()即可。查看您的選項here。基本上,你絕對不想要'w',而是'r+''a'之一,具體取決於你想要的行爲。

+1

這兩個解決方案仍會更新文件,它們只是不會完全截斷它。但是,最終會混合使用新舊數據,這可能同樣糟糕。 – Barmar

+0

@Barmar我在回答這個假設,即唯一的操作是一個簡單的'write',並且在嘗試「打開」時發生錯誤,但是您是對的,如果您真的*只想在成功修改文件退出'with'塊,你必須做一些事情,比如你的答案。 –

+0

確實,您的解決方案適用於問題中的簡單應用。 – Barmar

2

如果您不想對原始文件進行任何更改,除非一切順利,您應該將輸出寫入新文件。然後,當你完成後,將該文件重命名爲原始文件。

如果發生錯誤,您可以使用try/except來捕獲錯誤並在退出之前刪除臨時文件。

相關問題