2

Python 文件类型文档file.closed作为

bool 指示文件对象的当前状态。这是一个只读属性;该close()方法更改值。它可能不适用于所有类似文件的对象。

鉴于它不能保证在所有类似文件的对象上都可用,是否有另一种(更好的?)方法来检查我是否已经打开文件,然后再尝试重新打开它?

4

2 回答 2

5

返回的所有文件对象open都具有该closed属性。

类似文件的对象是实现与file(例如StringIO.StringIO)相同接口的对象,并且您引用的文档表明没有必要具有closed属性来实现这样的接口。

相同的文档到处都有关于应该在哪些类文件对象中实现哪些方法的注释。他们对属性也有这样的说法:

文件对象还提供了许多其他有趣的属性。这些对于类文件对象不是必需的,但如果它们对特定对象有意义,则应实施。

由于 close 方法的文档声明“任何需要打开文件的操作都会引发 ValueError ”,因此检查类文件对象是否已关闭的最佳方法是简单地使用文件,就好像它已打开一样,并抓住ValueError以防万一。

try:
    mystr = f.read(42)
except ValueError:
    # f was closed, do whatever needs doing

并非所有类似文件的对象都是seek-able,因此进行测试读取以检查对象是否已关闭(正如我建议的那样)是一个坏主意。这是因为您需要存储您已读取的内容以防文件被打开,然后以某种方式将其添加到实际读取中,当它发生时。最好简单地假设它是打开的并立即执行您想做的任何事情,然后在 except 子句中处理已关闭的文件。

正如评论中所指出的,人们不会简单地重新打开一个关闭的类似文件的对象。在StringIO示例中,关闭实际上删除了缓冲区,因此类文件对象不再像关闭之前那样具有“重新打开”自身所需的信息。

于 2012-08-08T07:02:49.523 回答
0

只是为了澄清@lazyr 已经说过的内容:文档指的是类似文件对象。实际文件对象将始终具有该closed属性,您可以使用它来查看文件是否已关闭。

于 2012-08-08T07:09:08.557 回答