考虑使用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
?如果你要问这个问题,你应该重构你的代码,这样就不存在这些歧义。实际上有无数可能的变量名称,如果为第二个文件句柄选择不同的名称,这个问题就会消失。
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?
不,它会被泄露,除非垃圾收集器注意到它未被使用并为您关闭它。
with
关键词是缩短的try except block
。
“如果你没有使用
with
关键字,那么你应该调用f.close()来关闭文件并立即释放它使用的任何系统资源。”