请考虑使用with
语句打开文件并将其命名为file_handle
的情况。然后从with
块中打开一个新文件,并将其分配给先前的file_handle
,如下所示:
with open('some/file') as file_handle:
# some codes
file_handle = open('another/file')
# more codes
我的问题:在这种情况下会发生什么?实际上,我想知道以下问题的答案:
file_handle
会怎样?分配后会关闭还是保持打开状态?with
块中发生了异常,是否会关闭新打开的文件?with
块完成后,它是否会关闭新的file_handle
?答案 0 :(得分:0)
如果您根本要问这个问题,则应该重组代码,以免出现此类歧义。字面上有无数个可能的变量名,如果您为第二个文件句柄选择了不同的名称,此问题将消失。
with open('some/file') as file_handle:
# some codes
with open('another/file') as file_handle_2:
# more codes
或者,如果不需要同时使用两个文件句柄,请使用两个单独的“ with”块,以便第一个在打开第二个之前关闭:
with open('some/file') as file_handle:
# some codes
with open('another/file') as file_handle_2:
# more codes
第一个file_handle会发生什么?分配后会关闭还是保持打开状态?
它保持打开状态,直到with
块结束。
如果赋值后,with块中发生了异常,那么是否会关闭新打开的文件?
不。 with
块控制第一个文件对象,没有任何内容明确跟踪第二个文件对象。
with块完成后,是否关闭新的file_handle?
不,它会泄漏,直到垃圾收集器注意到它没有使用并为您关闭为止。
答案 1 :(得分:0)
with
关键字是缩短的try except block
。
“如果您不是使用
with
关键字来不是,则应调用f.close()关闭文件并立即释放它使用的所有系统资源。”