发生错误时关闭文件而不保存-Python

发生错误时关闭文件而不保存-Python,python,python-3.x,Python,Python 3.x,我有一种情况,我使用“with”打开了一个文件。我对文件进行了一些编辑,如果更改成功,我会保存它。但是,每当在文件处理过程中发生错误时,我希望关闭该文件,而不对该文件进行任何更改。with似乎覆盖了文件并使文件为空 代码如下: with open(path + "\\Config\\"+ filename, 'wb') as configfile: config.write(configfile) 对于上面的代码,我得到了“类似字节的对象是必需的,而不是'str'”错误,这很好。但发

我有一种情况,我使用“with”打开了一个文件。我对文件进行了一些编辑,如果更改成功,我会保存它。但是,每当在文件处理过程中发生错误时,我希望关闭该文件,而不对该文件进行任何更改。with似乎覆盖了文件并使文件为空

代码如下:

with open(path + "\\Config\\"+ filename, 'wb') as configfile:
     config.write(configfile)
对于上面的代码,我得到了“类似字节的对象是必需的,而不是'str'”错误,这很好。但发生错误时,文件中的所有内容都已删除

如何明确地说代码不保存更改并恢复到更改之前存在的内容


我使用活动的python 3.5以与
w
不同的模式打开。如果文件不存在,将使用
'w'
创建,否则将截断文件中已有的内容。改用
'a'
,默认情况下不会截断。但是,请注意,文件光标将位于文件的末尾。如果没有错误,实际上要覆盖,则必须手动
f.seek(0)
然后
f.truncate()

编辑


实际上,最好使用
r+
,它也不会自动截断,并且流位于文件的开头而不是结尾(就像
'a'
一样),因此只需要一个简单的
f.truncate()
。看看你的选择。基本上,您肯定不想要
'w'
,但是
'r+'
'a'
中的任何一个都取决于您想要的行为。

如果您不想对原始文件做任何更改,除非一切都成功,那么您应该做的是将输出写入一个新文件。完成后,将该文件重命名为原始文件


如果发生错误,您可以使用
try/except
捕获错误并在退出之前删除临时文件。

这两种解决方案仍然会更新文件,只是不会完全截断它。但是你最终会得到新旧数据的混合,这可能同样糟糕。@Barmar我的回答是基于这样一个假设,即唯一的操作是一个简单的
写入
,并且在尝试
打开
时出错,但你是对的,如果您真的只想在成功退出带有块的
时修改文件,则必须执行与您的答案类似的操作。确实,您的解决方案适用于问题中的简单应用程序。