QFile.open() 在上下文管理方面是不是像 Python 的 open() 一样?
Posted
技术标签:
【中文标题】QFile.open() 在上下文管理方面是不是像 Python 的 open() 一样?【英文标题】:Does QFile.open() behave like Python's with open() in terms of context management?QFile.open() 在上下文管理方面是否像 Python 的 open() 一样? 【发布时间】:2017-07-26 17:29:09 【问题描述】:Qt4.8 文档(如 here 所述)建议 QtCore.QFile 对象在销毁时关闭其文件(如果文件已打开)。
这是否意味着这个 PyQt4 sn-p
my_file = QtCore.QFile('some_file.bin')
my_file.open(QtCore.QFile.ReadOnly)
... do stuff that might raise an exception ...
类似于这个非PyQt sn-p,它使用open()
作为上下文管理器?
with open('some_file.bin', 'rb') as my_file:
... do stuff that might raise an exception ...
也就是说,当出现问题并且程序退出时,文件会自动关闭(如讨论,例如here)。
【问题讨论】:
【参考方案1】:没有。如果发生错误,QFile
不会自动关闭。事实上,也不会有例外。 Qt 根本不做异常,因此您需要检查返回值并改为查询error()
方法。
这是一些示例输出:
>>> f = QtCore.QFile('/tmp/test.txt')
>>> f.open(QtCore.QIODevice.ReadWrite)
True
>>> f.resize(10)
True
注意 Qt 是如何在此处返回 True/False
,而 Python 会在出现问题时引发 OSError/IOError
。
>>> f.readAll()
PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> f.error() == QtCore.QFile.NoError
True
这里需要进行明确的检查,以确保读取时没有发生错误。
>>> f.close()
>>> f.open(QtCore.QIODevice.ReadOnly)
True
>>> f.resize(20)
False
>>> f.error() == QtCore.QFile.ResizeError
True
所以现在引发了一个错误 - 但没有引发异常,并且文件仍然打开且可读:
>>> f.isOpen()
True
>>> f.readAll()
PyQt4.QtCore.QByteArray(b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')
>>> f.error() == QtCore.QFile.NoError
True
删除QFile
会自动关闭它;但否则,您将需要显式关闭它以释放资源 - 即使在其生命周期内发生错误。
【讨论】:
感谢您提供明确的答案和很好的示例。还有一件事:假设在 QFile.open() 之后,我做了一些与文件无关的事情,确实引发了一个异常,该异常未被捕获并导致程序退出。在那种情况下,我猜 QFile 将被删除,所以文件 将自动关闭? @Dennis。这取决于是否还有对QFile
的引用。如果有任何东西使它保持活力,异常本身不会导致它自动关闭。但是当然,如果程序退出了,最终还是会被删除。以上是关于QFile.open() 在上下文管理方面是不是像 Python 的 open() 一样?的主要内容,如果未能解决你的问题,请参考以下文章
在 qt 中使用 QFile.open 和 Qdir 将文件保存在特定目录中