2017-05-17 41 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来捕获错误并在退出之前删除临时文件。

相关问题