溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用linecache模塊怎么緩存文件

發(fā)布時間:2021-03-17 16:20:58 來源:億速云 閱讀:264 作者:Leah 欄目:開發(fā)技術(shù)

使用linecache模塊怎么緩存文件?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

linecache模塊

接觸到linecache這個模塊是因為前兩天讀attrs源碼的時候看到內(nèi)部代碼引用了這個模塊來模擬一個假文件,帶著一臉疑問順便讀了一下這個模塊的源碼,發(fā)現(xiàn)其實也就那么回事兒,代碼不多,在這總結(jié)一下。

linecache模塊可以讀取文件并將文件內(nèi)容緩存起來,方便后面多次讀取。這個模塊原本被設(shè)計用來讀取Python模塊的源代碼,所以當一個文件名不在指定路徑下的時候,模塊會通過搜索路徑(search path)來嘗試讀取文件。

接口

linecache模塊的__all__參數(shù)其實只提供了getline/clearcache/checkcache三個接口,但實際上可以使用的不止這些,下面我會對所有接口逐個進行介紹。

linecache.getline(filename, lineno, module_globals=None)

獲取指定文件的某一行,filename指定文件名、lineno指定行號、module_globals用于指定模塊的上下文我也不知道怎么稱呼,姑且稱為上下文吧,最后一個參數(shù)其實到會傳到linecache.updatecache()里,用于嘗試使用__loader__加載文件,一般情況下不會用到最后一個參數(shù),忽略即可。當行號小于一或大于文件最大行號時函數(shù)直接返回空字符串。

linecache.clearcache()

清空所有緩存,注意是所有。

linecache.checkcache(filename=None)

這個函數(shù)用于檢查緩存,如果文件的大小或者修改時間有變化,會把文件原先的緩存刪除,如果文件是懶加載的則保持不變。當filename為None時檢查緩存中的所有文件。

以下是沒寫進模塊__all__參數(shù)的接口。

linecache.lazycache(filename, module_globals)

對指定文件使用懶加載,啟用懶加載成功的文件會在實際調(diào)用獲取內(nèi)容的接口時才將文件內(nèi)容加載進內(nèi)存,使用這個可以避免多余的文件IO。返回值為一個布爾值,當懶加載成功時返回True,如果文件內(nèi)容已經(jīng)實際加載進內(nèi)存或者加載失敗則返回False。

這個函數(shù)的module_globals參數(shù)是必填的,其實就是傳入要加載文件對應(yīng)模塊的上下文。比如加載linecache模塊,則傳入linecache.__dict__或者vars(linecache)(目前只想到這兩種方法,當然你要自己構(gòu)建一個字典傳進去也是可以的)。然后函數(shù)會根據(jù)上下文獲取__loader__的get_source函數(shù)保存到緩存中。這個函數(shù)是在Python3.5后新增的。

linecache.updatecache(filename, module_globals=None)

這個函數(shù)是整個模塊的核心,用于更新文件緩存并返回文件內(nèi)容。函數(shù)中間任何一個環(huán)節(jié)出錯了會返回一個空列表。

對于普通文件,內(nèi)部使用tokenize.open()函數(shù)用于打開文件,檢測文件的編碼并使用檢測到的編碼打開文件,如果缺失編碼默認使用UTF-8。如果給定路徑無法打開文件則使用sys.path指定的路徑嘗試加載。如果文件內(nèi)容的最后一行不帶\n,會自動在最后一個字符加上\n。

對于懶加載的文件,則調(diào)用懶加載時保存的get_source函數(shù)獲取文件內(nèi)容。

注意:linecache在打開文件之后使用readlines一次性加載所有文件內(nèi)容,所以在文件很多或者文件太大時會出現(xiàn)問題,所以還是應(yīng)該謹慎使用。

linecache.getlines(filename, module_globals=None)

獲取文件所有內(nèi)容,如果文件尚未加載或者是懶加載,會調(diào)用linecache.updatecache()加載文件內(nèi)容,如果出現(xiàn)MemoryError則清空緩存。linecache.getline()其實內(nèi)部就是調(diào)用了這個函數(shù)。

linecache.cache

這是一個字典,所有文件的緩存就存在這里面。字典的Key是你讀取時傳入的filename,Value是一個保存了文件大小、修改時間、內(nèi)容、名字的元組,當文件為懶加載時則是對應(yīng)__loader__的get_source函數(shù)。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI