在同一个 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)
在所有可能的情况下这样做是否安全?
这不是上下文管理器的问题。两个上下文管理器工作正常!问题在这里:
open("path", "w")
当您以写入方式打开时,文件被截断。换句话说,所有数据都被删除。之后读取将显示该文件为空。
因此您必须分两步完成此操作。
让我们考虑一个 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)
在所有可能的情况下这样做是否安全?
这不是上下文管理器的问题。两个上下文管理器工作正常!问题在这里:
open("path", "w")
当您以写入方式打开时,文件被截断。换句话说,所有数据都被删除。之后读取将显示该文件为空。
因此您必须分两步完成此操作。