“with”块空白文件中的异常打开以进行写入

时间:2014-12-26 10:54:57

标签: python file

这个简单的代码

# This code will BLANK the file 'myfile'!
with open('myfile', 'w') as file:
    raise Exception()

而不仅仅是抛出异常,删除“myfile”中的所有数据,,尽管甚至没有尝试过实际的写操作。

至少可以说这是危险的,当然也不是其他语言如何处理这种情况。

我怎么能阻止这个?我是否必须处理所有可能的异常,以确保目标文件不会被某些无法预料的情况消隐?当然必须有一个标准模式来解决这个问题。最重要的是:首先发生了什么?

3 个答案:

答案 0 :(得分:3)

您正在打开文件进行写作。 这个简单的操作会使文件空白,无论你用它做什么。来自open() function documentation

  

'w'
  开放写作,首先截断文件

强调我的。本质上,文件是空的,因为你没有写任何东西,而不是因为你打开它。

如果您不希望这种情况发生,请将文件推迟到您实际要写入数据的位置。将字符串列表写入文件不会导致Python级别的异常

或者,写入 new 文件,然后重命名(移动)它以替换原始文件。将文件重命名为操作系统。

答案 1 :(得分:0)

语句open('myfile', 'w') 删除执行中的所有内容,即截断文件。

如果您想保留必须使用的行open('myfile', 'a')a选项适用于append

答案 2 :(得分:0)

打开文件进行写入会删除内容。避免数据丢失的最佳方法,不仅是在出现异常,计算机关闭等情况下,还要创建一个新的临时文件,并在完成所有操作后将文件重命名为原始名称。

yourfile = "myfile"
try:
    with tempfile.NamedTemporaryFile(dir=os.path.dirname(yourfile) or '.', delete=False) as output:
        do_something()
except Exception:
    handle_exception()
else:
    os.rename(output.name, yourfile)