Python文件类型文档将file.closed
作为
bool指示文件对象的当前状态。这是一个只读属性;
close()
方法更改了值。它可能不适用于所有类似文件的对象。
鉴于它不能保证在所有类似文件的对象上可用,是否有另一种(更好的?)方法检查我是否已经打开文件,然后再尝试重新打开它?
答案 0 :(得分:5)
open
返回的所有文件对象都具有closed
属性。
类似文件的对象是与file
实现相同界面的对象(例如StringIO.StringIO
),而您引用的文档表明没有必要拥有closed
}属性,以实现这样的接口。
same docs有关于哪些方法应该在哪些文件类对象中实现的说明。他们也有关于属性的说法:
文件对象还提供了许多其他有趣的属性。这些对于类文件对象不是必需的,但如果它们对特定对象有意义,则应该实现。
由于close方法的文档声明“任何需要打开文件的操作都会引发ValueError ”,因此检查文件类对象是否关闭的最佳方法是只需将文件用作打开文件即可,如果不是,则抓住ValueError
。
try:
mystr = f.read(42)
except ValueError:
# f was closed, do whatever needs doing
并非所有类似文件的对象都是seek
- 能够进行测试读取以检查对象是否已关闭(正如我建议的那样)是一个坏主意。这是因为你需要存储你读过的文件,以防文件结果打开,然后以某种方式将它添加到实际读取,当它发生时。最好简单地假设它是开放的并立即执行任何操作,然后在except子句中处理已关闭的文件。
正如评论中指出的那样,不仅仅是重新打开一个类似文件的封闭对象。在StringIO
示例中,关闭实际上删除了缓冲区,因此类文件对象不再具有“关闭”之前“重新打开”自身所需的信息。
答案 1 :(得分:0)
只是为了澄清@lazyr已经说过的内容:文档引用了像这样的对象。实际文件对象将始终具有closed
属性,您可以使用它来查看文件是否已关闭。