文件句柄分配

时间:2018-09-02 12:50:40

标签: python file-handling

请考虑使用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

2 个答案:

答案 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()关闭文件并立即释放它使用的所有系统资源。”