2016-07-29 17 views
4

在關於python單線程的this question的評論中,我想到了我不知道python如何處理匿名文件對象。從這樣一個問題:何時/如何關閉匿名文件對象?

open(to_file, 'w').write(open(from_file).read()) 

有兩種調用open不使用with關鍵字(這通常是我如何處理文件)。過去,我曾使用過這種未命名的文件。 IIRC,似乎在文件上剩下的操作系統級別鎖定會在一兩分鐘後過期。

那麼這些文件句柄會發生什麼?他們是否被垃圾收集清理?由操作系統?當調用close()時,Python機器和文件會發生什麼情況,當腳本完成並且過了一段時間後,它會發生什麼?

回答

4

監視Linux上的文件描述符(通過檢查/ proc/$$/fds)和Windows上的File Handle(使用SysInternals工具),看起來該文件在語句後立即關閉。

但無法保證,因爲垃圾收集器必須執行。在我做的測試中,它每次都會一次關閉。

with聲明建議與open一起使用,但實際需要的情況很少見。很難演示一個場景,你需要必須使用with,但它可能是一個好主意,是安全的。

所以,你的一行變爲:

with open(to_file, 'w') as tof, open(from_file) as fof: 
    tof.write(fof.read()) 

with的優點是特殊的方法(在IO類)稱爲__exit__()保證*被調用。

*除非你做了類似os._exit()的東西。

1

垃圾收集器收集這些文件後,文件將被關閉,CPython將立即收集它們,因爲它使用引用計數,但這不是一種保證行爲。

如果您在循環中使用文件而不關閉它們,則可能會用完文件描述符,這就是爲什麼建議使用with語句(如果您使用的是2.5,則可以使用from __future__ import with_statement)。