linecache模塊加載和緩存文件內(nèi)容詳解
linecache模塊
接觸到linecache這個(gè)模塊是因?yàn)榍皟商熳xattrs源碼的時(shí)候看到內(nèi)部代碼引用了這個(gè)模塊來(lái)模擬一個(gè)假文件,帶著一臉疑問(wèn)順便讀了一下這個(gè)模塊的源碼,發(fā)現(xiàn)其實(shí)也就那么回事兒,代碼不多,在這總結(jié)一下。
linecache模塊可以讀取文件并將文件內(nèi)容緩存起來(lái),方便后面多次讀取。這個(gè)模塊原本被設(shè)計(jì)用來(lái)讀取Python模塊的源代碼,所以當(dāng)一個(gè)文件名不在指定路徑下的時(shí)候,模塊會(huì)通過(guò)搜索路徑(search path)來(lái)嘗試讀取文件。
接口
linecache模塊的__all__參數(shù)其實(shí)只提供了getline/clearcache/checkcache三個(gè)接口,但實(shí)際上可以使用的不止這些,下面我會(huì)對(duì)所有接口逐個(gè)進(jìn)行介紹。
linecache.getline(filename, lineno, module_globals=None)
獲取指定文件的某一行,filename指定文件名、lineno指定行號(hào)、module_globals用于指定模塊的上下文我也不知道怎么稱呼,姑且稱為上下文吧,最后一個(gè)參數(shù)其實(shí)到會(huì)傳到linecache.updatecache()里,用于嘗試使用__loader__加載文件,一般情況下不會(huì)用到最后一個(gè)參數(shù),忽略即可。當(dāng)行號(hào)小于一或大于文件最大行號(hào)時(shí)函數(shù)直接返回空字符串。
linecache.clearcache()
清空所有緩存,注意是所有。
linecache.checkcache(filename=None)
這個(gè)函數(shù)用于檢查緩存,如果文件的大小或者修改時(shí)間有變化,會(huì)把文件原先的緩存刪除,如果文件是懶加載的則保持不變。當(dāng)filename為None時(shí)檢查緩存中的所有文件。
以下是沒(méi)寫(xiě)進(jìn)模塊__all__參數(shù)的接口。
linecache.lazycache(filename, module_globals)
對(duì)指定文件使用懶加載,啟用懶加載成功的文件會(huì)在實(shí)際調(diào)用獲取內(nèi)容的接口時(shí)才將文件內(nèi)容加載進(jìn)內(nèi)存,使用這個(gè)可以避免多余的文件IO。返回值為一個(gè)布爾值,當(dāng)懶加載成功時(shí)返回True,如果文件內(nèi)容已經(jīng)實(shí)際加載進(jìn)內(nèi)存或者加載失敗則返回False。
這個(gè)函數(shù)的module_globals參數(shù)是必填的,其實(shí)就是傳入要加載文件對(duì)應(yīng)模塊的上下文。比如加載linecache模塊,則傳入linecache.__dict__或者vars(linecache)(目前只想到這兩種方法,當(dāng)然你要自己構(gòu)建一個(gè)字典傳進(jìn)去也是可以的)。然后函數(shù)會(huì)根據(jù)上下文獲取__loader__的get_source函數(shù)保存到緩存中。這個(gè)函數(shù)是在Python3.5后新增的。
linecache.updatecache(filename, module_globals=None)
這個(gè)函數(shù)是整個(gè)模塊的核心,用于更新文件緩存并返回文件內(nèi)容。函數(shù)中間任何一個(gè)環(huán)節(jié)出錯(cuò)了會(huì)返回一個(gè)空列表。
對(duì)于普通文件,內(nèi)部使用tokenize.open()函數(shù)用于打開(kāi)文件,檢測(cè)文件的編碼并使用檢測(cè)到的編碼打開(kāi)文件,如果缺失編碼默認(rèn)使用UTF-8。如果給定路徑無(wú)法打開(kāi)文件則使用sys.path指定的路徑嘗試加載。如果文件內(nèi)容的最后一行不帶\n,會(huì)自動(dòng)在最后一個(gè)字符加上\n。
對(duì)于懶加載的文件,則調(diào)用懶加載時(shí)保存的get_source函數(shù)獲取文件內(nèi)容。
注意:linecache在打開(kāi)文件之后使用readlines一次性加載所有文件內(nèi)容,所以在文件很多或者文件太大時(shí)會(huì)出現(xiàn)問(wèn)題,所以還是應(yīng)該謹(jǐn)慎使用。
linecache.getlines(filename, module_globals=None)
獲取文件所有內(nèi)容,如果文件尚未加載或者是懶加載,會(huì)調(diào)用linecache.updatecache()加載文件內(nèi)容,如果出現(xiàn)MemoryError則清空緩存。linecache.getline()其實(shí)內(nèi)部就是調(diào)用了這個(gè)函數(shù)。
linecache.cache
這是一個(gè)字典,所有文件的緩存就存在這里面。字典的Key是你讀取時(shí)傳入的filename,Value是一個(gè)保存了文件大小、修改時(shí)間、內(nèi)容、名字的元組,當(dāng)文件為懶加載時(shí)則是對(duì)應(yīng)__loader__的get_source函數(shù)。
總結(jié)
Python標(biāo)準(zhǔn)庫(kù)內(nèi)置了很多基礎(chǔ)模塊,平時(shí)不會(huì)注意到,但是總有一些別的代碼會(huì)依賴到這些基礎(chǔ)設(shè)施,像標(biāo)準(zhǔn)庫(kù)里的pdb和traceback都有用到linecache模塊。這里面其實(shí)有不少代碼是能加以利用的,平時(shí)多多讀源碼,會(huì)有驚喜的。
以上就是本文關(guān)于linecache模塊加載和緩存文件內(nèi)容詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Python?中?Pandas?文件操作和讀取?CSV?參數(shù)詳解
CSV?又稱逗號(hào)分隔值文件,是一種簡(jiǎn)單的文件格式,以特定的結(jié)構(gòu)來(lái)排列表格數(shù)據(jù),這篇文章主要介紹了Python?之?Pandas?文件操作和讀取?CSV?參數(shù)詳解,需要的朋友可以參考下2023-03-03使用python實(shí)現(xiàn)自動(dòng)化控制電腦版微信
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python去調(diào)用Windows API實(shí)現(xiàn)模擬人工操作的方式去實(shí)現(xiàn)控制微信電腦版,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10Python爬蟲(chóng)基礎(chǔ)講解之scrapy框架
scrapy是一個(gè)使用Python語(yǔ)言(基于Twisted框架)編寫(xiě)的開(kāi)源網(wǎng)絡(luò)爬蟲(chóng)框架,目前由scrapinghub Ltd維護(hù).Scrapy簡(jiǎn)單易用、靈活易拓展、開(kāi)發(fā)社區(qū)活躍,并且是跨平臺(tái)的.在Linux、MaxOS以及windows平臺(tái)都可以使用,需要的朋友可以參考下2021-06-06python利用不到一百行代碼實(shí)現(xiàn)一個(gè)小siri
這篇文章主要介紹了關(guān)于python利用不到一百行代碼實(shí)現(xiàn)了一個(gè)小siri的相關(guān)資料,文中介紹的很詳細(xì),對(duì)大家具有一定的參考借鑒價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03快速解決jupyter notebook啟動(dòng)需要密碼的問(wèn)題
這篇文章主要介紹了快速解決jupyter notebook啟動(dòng)需要密碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python遠(yuǎn)程連接服務(wù)器MySQL數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了python遠(yuǎn)程連接服務(wù)器MySQL數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07