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

Is it safe using 2 context managers in the same with clause to modify a file in-place?

让我们考虑一个 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/

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

open("path", "w")

当您以写入方式打开时,文件被截断。换句话说,所有数据都被删除。之后读取将显示该文件为空。

因此您必须分两步完成此操作。