文件句柄分配

问题描述 投票:0回答:2

考虑使用with语句打开文件并将其命名为file_handle的情况。然后从with块中打开一个新文件,并将其分配给以前的file_handle,如下所示:

with open('some/file') as file_handle:
    # some codes
    file_handle = open('another/file')
    # more codes

我的问题:在这种情况下会发生什么?事实上,我想知道以下问题的答案:

  1. 第一个file_handle会发生什么?它会在转让后关闭还是仍然开放?
  2. 如果在赋值后,with块中发生异常,是否会关闭新打开的文件?
  3. 一旦with块完成,它是否关闭新的file_handle
python file-handling
2个回答
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?

不,它会被泄露,除非垃圾收集器注意到它未被使用并为您关闭它。


0
投票

with关键词是缩短的try except block

“如果你没有使用with关键字,那么你应该调用f.close()来关闭文件并立即释放它使用的任何系统资源。”

© www.soinside.com 2019 - 2024. All rights reserved.