如何检查zipfile是否尚未关闭

时间:2012-08-10 08:18:37

标签: python zipfile

Python检查ZipFile对象是否尚未关闭的最佳方法是什么?

目前我正在课堂上这样做:

try:
    self.zf.open(archive_name).close()
except RuntimeError:
    self.zf = zipfile.ZipFile(self.path)

with self.zf.open(archive_name) as f: 
    # do stuff...

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

在内部,有一个名为fp的打开文件指针,它会在关闭时被清除;你也可以自己测试一下:

if not self.zf.fp:
    self.zf = zipfile.ZipFile(self.path)

zipfile module source;如果open为True,则RuntimeError方法会引发not self.fp异常。

请注意,依赖此类内部的,未记录的实现可能会很毛茸茸;如果未来的实现改变你的代码将破坏,也许是微妙的方式。确保您的项目具有良好的测试覆盖率。

或者,您可以创建一个ZipFile子类并覆盖.close方法来跟踪状态,这样可以减少因内部更改而中断的风险:

class MyZipFile(zipfile.ZipFile):
    closed = False
    def close(self):
        self.closed = True
        super(MyZipFile, self).close()

if self.zf.closed:
    self.zf = MyZipFile(self.path)

感谢aknuds1的建议