Python 文件类型文档将 file.close
作为
bool indicating the current state of the file object. This is a read-only attribute; the
close()
method changes the value. It may not be available on all file-like objects.
鉴于它不能保证在所有类似文件的对象上都可用,是否有另一种(更好?)方法来检查我是否已经打开文件,然后再尝试重新打开它?
最佳答案
open
返回的所有文件对象都具有 close
属性。
类似文件的对象是实现与 file
相同接口(interface)的对象(例如 StringIO.StringIO
),并且您引用的文档表明不需要 close
属性以实现这样的接口(interface)。
same docs到处都有关于应该在哪些类文件对象中实现哪些方法的注释。他们对属性也有这样的说法:
File objects also offer a number of other interesting attributes. These are not required for file-like objects, but should be implemented if they make sense for the particular object.
由于 close 方法的文档指出“任何需要打开文件的操作都会引发 ValueError”,因此检查类文件对象是否已关闭的最佳方法是只需像打开文件一样使用该文件,并捕获 ValueError
万一它没有打开。
try:
mystr = f.read(42)
except ValueError:
# f was closed, do whatever needs doing
并非所有类似文件的对象都可以seek
,因此执行测试读取来检查对象是否已关闭(正如我开始时建议的那样)是一个馊主意。这是因为您需要存储您所读取的内容,以防文件打开,然后在发生这种情况时以某种方式将其添加到实际读取中。最好简单地假设它是打开的并立即执行您想做的任何操作,然后在 except 子句中处理已关闭的文件。
正如评论中所指出的,人们不会简单地重新打开一个关闭的类似文件的对象。在 StringIO
示例中,关闭实际上会删除缓冲区,因此类文件对象不再像关闭之前那样具有“重新打开”自身所需的信息。
关于python - 检查文件是否以任何文件类型打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11859234/