如何在Python中检查文件是否已关闭?

6
我该如何使用这个命令检查文件 "file_name" 是否仍然处于打开状态?
csv_gen = (row for row in open(file_name))

我知道我们应该使用类似于

with open(file_name) as file_name_ref:
    csv_gen = (row for row in file_name_ref)

但发生了什么事情,如果我使用前一个命令,如何检查行为。


2
如果在with语句结束之前不消耗生成器,第二个也是不正确的。 - chepner
你可以假设在上下文管理器之外时文件已关闭。 - Grajdeanu Alex
1
@wjandrea 在第一种情况下没有对象的引用,因此您无法检查 closed 属性。 - chepner
@chepner,哦,我明白了,他们想要在代码片段之后检查它是否仍然开着。 - wjandrea
1
是的,它应该保持打开状态,直到“generator”对象被垃圾回收。 - chepner
2个回答

7

您可以使用跨平台模块psutil获取所有打开的文件列表:

import psutil
open_files = [x.path for x in psutil.Process().open_files()]

如果file_name在列表中,那么它是打开状态,可能不止一次。

3

一种方法是深入generator对象本身,找到由open返回的TextIOWrapper实例的引用;该实例具有一个closed属性。

csv_gen.gi_frame.f_locals['.0'].closed

一旦生成器用尽,gi_frame 将变成 None,此时文件是否关闭取决于 TextIOWrapper 是否已被垃圾回收。

(这是一种可怕的做法,但我花了10分钟挖掘对象,所以想分享一下 :))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接