python - 检查文件是否以任何文件类型打开

标签 python

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/

相关文章:

python - 如何用该列的平均值填充数据框中的空白(Nan)?

python - scipy 稀疏矩阵的对称化

python - 在 Python 3 中获取两个列表之间的交集

python - 跳过跳棋时无法弄清楚如何杀死它

python - 如何在numpy中创建数组矩阵?

Python 3 Markdown 到 html : how to enable code-fencing/syntax highlighting

python - 在python pandas的循环中合并大数据框中的许多子数据框

python - 如何让 Python 进程使用所有 Docker 容器内存而不被杀死?

python - 如何在 Django 中使用管道压缩特定文件?

Python - 绘制大量线条