在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ 將文件對象封裝成迭代對象,這樣使用try來操作文件會有什么風險,能不能保證一定關(guān)

將文件對象封裝成迭代對象,這樣使用try來操作文件會有什么風險,能不能保證一定關(guān)閉文件

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

我想知道這樣操作文件什么時候會發(fā)生文件未關(guān)閉的情況
我現(xiàn)在自己理解的幾種情況:

  1. open() 函數(shù)如果失敗,我不處理,因為文件還沒有打開
  2. 如果迭代結(jié)束拋出 StopIteration,我執(zhí)行 close() 關(guān)閉文件
  3. 如果在迭代中發(fā)生任何錯誤,就是拋出其他異常,我執(zhí)行 close() 關(guān)閉文件
  4. 現(xiàn)在我覺得有一種情況不會關(guān)閉,就是迭代到一半不迭代了,也就是 while 語句中其他異常拋出(在
    StopIteration 之前拋出),那么將不執(zhí)行 close() 關(guān)閉文件

這是我的理解,我不知道以上有什么疏忽,或者錯誤。還有什么情況會導(dǎo)致無法 close() 文件。

回答
編輯回答
心夠野

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()***

自己在類中加了個析構(gòu)函數(shù)。所以只要在某個函數(shù)作用域中生成該類實例對象和使用,并且最后這個函數(shù)結(jié)束,那么對象的析構(gòu)函數(shù)就被調(diào)用就可以保證關(guān)閉文件(其他不會關(guān)閉的情況我也想不到了)。其實我一般都是用with的,就是項目比較特殊with不滿足。
感謝@yszou 的回答。

2018年1月25日 08:20
編輯回答
老梗

確保文件關(guān)閉用 with ( context ) 就完了 ,文件本身就是可以 iter 的。你弄的這些,在 python 中都是現(xiàn)成的嘛。

2017年3月31日 15:20