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
我想知道这样操作文件什么时候会发生文件未关闭的情况
我现在自己理解的几种情况:
-
open()
函数如果失败,我不处理,因为文件还没有打开 - 如果迭代结束抛出
StopIteration
,我执行close()
关闭文件 - 如果在迭代中发生任何错误,就是抛出其他异常,我执行
close()
关闭文件 - 现在我觉得有一种情况不会关闭,就是迭代到一半不迭代了,也就是
while
语句中其他异常抛出(在StopIteration
之前抛出),那么将不执行close()
关闭文件
这是我的理解,我不知道以上有什么疏忽,或者错误。还有什么情况会导致无法 close()
文件。
class TempDataFileCanIter(object):
自己在类中加了个析构函数。所以只要在某个函数作用域中生成该类实例对象和使用,并且最后这个函数结束,那么对象的析构函数就被调用就可以保证关闭文件(其他不会关闭的情况我也想不到了)。其实我一般都是用with的,就是项目比较特殊with不满足。
感谢@yszou 的回答。