2012-08-08 79 views
2

Python的文件类型的文件给file.closed检查是否打开文件进行任何类型的文件

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

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

+1

...一个通常不会“重新打开”文件样的;通常只是重新创建对象。 – 2012-08-08 07:02:00

+0

@ IgnacioVazquez-Abrams我有一段时间没有做文件IO。为什么我不想保留对象但关闭文件? – simont 2012-08-08 07:06:19

+0

文件喜欢通常不用于首先关闭的文件。 – 2012-08-08 07:07:06

回答

5

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

类文件对象是实现了相同的接口file(例如StringIO.StringIO)对象,你所引用的文档表明,这是没有必要有一个closed属性,为了实现这样的接口。

same docs已经注意到了应该在哪些文件类对象中实现哪些方法。他们也有这样的属性说:

文件对象还提供了一些其他有趣的属性。对于类似文件的对象,这些不是必需的,但是如果它们对于特定对象有意义的话应该被实现。

由于文档的接近方法,指出“要求该文件是开放将引发ValueError任何操作”,最好的方式来检查,如果一个类文件时关闭对象是简单地使用该文件就好像是打开的,并且如果不是,则捕获ValueError

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

并非所有类似文件的对象是seek -able,所以做了测试读取检查,如果该对象已关闭(我建议开始)是一个坏主意。这是因为那么你需要存储你读过的文件,以防文件变成打开状态,然后以某种方式将它添加到实际的读取中。最好简单地假定它是开放的,并且可以立即做任何你想做的事情,然后在except子句中处理关闭的文件。

正如已经在评论中指出的那样,一个不会简单地重新打开一个封闭的文件类对象。在StringIO示例中,closing实际上会删除缓冲区,所以类文件对象不再具有“自我重新打开”所需的信息,因为它以前是在关闭之前进行的。

+1

这是我通常捅你没有回答的问题,但我不太确定这个问题*有*正确的答案开始... – 2012-08-08 07:05:02

+0

@Ignacio我会尽力回答这个问题, 不挂断。 – 2012-08-08 07:05:41

0

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

相关问题