使用同一个子句中的2个上下文管理器来就地修改文件是否安全?

时间:2017-11-30 17:20:52

标签: python contextmanager

为了完整性示例,我们考虑转换字符串的foo函数:

def foo(data):
    ### processes data in a fancy way ###
    return data.lower() # :P

我想知道它是否是一个好主意,取代原样修改文件的典型模式,如下所示:

# snippet1
with open(path, "r") as f:
    out = foo(f.read())

with open(path, "w") as f:
    f.write(out)

另一个人:

# snippet2
with open(path, "r") as f1:
    out = foo(f1.read())
    with open(path, "w") as f2:
        f2.write(out)

在所有可能的情况下,这样做是否安全?

相关信息https://www.python.org/dev/peps/pep-0343/

1 个答案:

答案 0 :(得分:0)

这不是上下文管理器的问题。两个上下文管理器工作正常问题出在这里:

open("path", "w")

打开进行写入时,文件会被截断。换句话说,删除所有数据。之后阅读将显示该文件为空。

所以你必须分两步完成。