将文件对象封装成迭代对象,这样使用try来操作文件会有什么风险,能不能保证一定关闭文件

class TempDataFileCanIter(object):
    """
    将文件对象封装成迭代器
    """
    def __init__(self, tempDataFilePath):
        self.tDFile = open(tempDataFilePath, "r")
        
    def __iter__(self):
        return self
        
    def next(self):
        try:
            for line in self.tDFile:
                return line.rstrip()
            raise StopIteration()
        except StopIteration:
            self.tDFile.close()
            raise StopIteration()
        except BaseException, ex:
            self.tDFile.close()
            raise Exception(ex)
tdfci = TempDataFileCanIter("doc.txt")

while True:
    try:
        lineValue = tdfci.next()
        print lineValue
    except StopIteration:
        break
    except Exception:
        break

我想知道这样操作文件什么时候会发生文件未关闭的情况
我现在自己理解的几种情况:

  1. open() 函数如果失败,我不处理,因为文件还没有打开
  2. 如果迭代结束抛出 StopIteration,我执行 close() 关闭文件
  3. 如果在迭代中发生任何错误,就是抛出其他异常,我执行 close() 关闭文件
  4. 现在我觉得有一种情况不会关闭,就是迭代到一半不迭代了,也就是 while 语句中其他异常抛出(在
    StopIteration 之前抛出),那么将不执行 close() 关闭文件

这是我的理解,我不知道以上有什么疏忽,或者错误。还有什么情况会导致无法 close() 文件。

阅读 1.5k
2 个回答
✓ 已被采纳新手上路,请多包涵

class TempDataFileCanIter(object):

"""
将文件对象封装成迭代器
"""
def __init__(self, tempDataFilePath):
    self.tDFile = open(tempDataFilePath, "r")
    
def __iter__(self):
    return self
    
def next(self):
    try:
        for line in self.tDFile:
            return line.rstrip()
        raise StopIteration()
    except StopIteration:
        self.tDFile.close()
        raise StopIteration()
    except BaseException, ex:
        self.tDFile.close()
        raise Exception(ex)
        
***def __def__(self):
    self.tDFile.close()***

自己在类中加了个析构函数。所以只要在某个函数作用域中生成该类实例对象和使用,并且最后这个函数结束,那么对象的析构函数就被调用就可以保证关闭文件(其他不会关闭的情况我也想不到了)。其实我一般都是用with的,就是项目比较特殊with不满足。
感谢@yszou 的回答。

确保文件关闭用 with ( context ) 就完了 ,文件本身就是可以 iter 的。你弄的这些,在 python 中都是现成的嘛。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题