Python的文件类型的文件给file.closed
为检查是否打开文件进行任何类型的文件
布尔表示文件对象的当前状态。这是只读属性;
close()
方法更改值。它可能不适用于所有类文件对象。
鉴于它不能保证在所有文件类对象上都可用,是否有另一个(更好的?)方法检查我是否已经打开文件,然后尝试重新打开它?
Python的文件类型的文件给file.closed
为检查是否打开文件进行任何类型的文件
布尔表示文件对象的当前状态。这是只读属性;
close()
方法更改值。它可能不适用于所有类文件对象。
鉴于它不能保证在所有文件类对象上都可用,是否有另一个(更好的?)方法检查我是否已经打开文件,然后尝试重新打开它?
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实际上会删除缓冲区,所以类文件对象不再具有“自我重新打开”所需的信息,因为它以前是在关闭之前进行的。
这是我通常捅你没有回答的问题,但我不太确定这个问题*有*正确的答案开始... – 2012-08-08 07:05:02
@Ignacio我会尽力回答这个问题, 不挂断。 – 2012-08-08 07:05:41
只是为了澄清@lazyr已经说过的内容:文档指的是文件,比如对象。实际文件对象将始终具有closed
属性,您可以使用它来查看文件是否已关闭。
...一个通常不会“重新打开”文件样的;通常只是重新创建对象。 – 2012-08-08 07:02:00
@ IgnacioVazquez-Abrams我有一段时间没有做文件IO。为什么我不想保留对象但关闭文件? – simont 2012-08-08 07:06:19
文件喜欢通常不用于首先关闭的文件。 – 2012-08-08 07:07:06