欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

linecache模塊加載和緩存文件內容詳解

 更新時間:2018年01月11日 10:47:23   作者:GanZiQim  
這篇文章主要介紹了linecache模塊加載和緩存文件內容詳解,具有一定借鑒價值,需要的朋友可以參考下

linecache模塊

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

linecache模塊可以讀取文件并將文件內容緩存起來,方便后面多次讀取。這個模塊原本被設計用來讀取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)

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

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

linecache.updatecache(filename, module_globals=None)

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

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

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

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

linecache.getlines(filename, module_globals=None)

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

linecache.cache

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

總結

Python標準庫內置了很多基礎模塊,平時不會注意到,但是總有一些別的代碼會依賴到這些基礎設施,像標準庫里的pdb和traceback都有用到linecache模塊。這里面其實有不少代碼是能加以利用的,平時多多讀源碼,會有驚喜的。

以上就是本文關于linecache模塊加載和緩存文件內容詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關文章

  • Python?中?Pandas?文件操作和讀取?CSV?參數(shù)詳解

    Python?中?Pandas?文件操作和讀取?CSV?參數(shù)詳解

    CSV?又稱逗號分隔值文件,是一種簡單的文件格式,以特定的結構來排列表格數(shù)據(jù),這篇文章主要介紹了Python?之?Pandas?文件操作和讀取?CSV?參數(shù)詳解,需要的朋友可以參考下
    2023-03-03
  • 使用python實現(xiàn)自動化控制電腦版微信

    使用python實現(xiàn)自動化控制電腦版微信

    這篇文章主要為大家詳細介紹了如何通過Python去調用Windows API實現(xiàn)模擬人工操作的方式去實現(xiàn)控制微信電腦版,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-10-10
  • python遞歸刪除指定目錄及其所有內容的方法

    python遞歸刪除指定目錄及其所有內容的方法

    下面小編就為大家?guī)硪黄猵ython遞歸刪除指定目錄及其所有內容的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • pytorch如何自定義數(shù)據(jù)集

    pytorch如何自定義數(shù)據(jù)集

    這篇文章主要介紹了pytorch自定義數(shù)據(jù)集,在識別手寫數(shù)字的例子中,數(shù)據(jù)集是直接下載的,但如果我們自己收集了一些數(shù)據(jù),存在電腦文件夾里,我們該如何把這些數(shù)據(jù)變?yōu)榭梢栽赑yTorch框架下進行神經(jīng)網(wǎng)絡訓練的數(shù)據(jù)集呢,即如何自定義數(shù)據(jù)集呢,需要的朋友可以參考下
    2024-01-01
  • Python爬蟲基礎講解之scrapy框架

    Python爬蟲基礎講解之scrapy框架

    scrapy是一個使用Python語言(基于Twisted框架)編寫的開源網(wǎng)絡爬蟲框架,目前由scrapinghub Ltd維護.Scrapy簡單易用、靈活易拓展、開發(fā)社區(qū)活躍,并且是跨平臺的.在Linux、MaxOS以及windows平臺都可以使用,需要的朋友可以參考下
    2021-06-06
  • python利用不到一百行代碼實現(xiàn)一個小siri

    python利用不到一百行代碼實現(xiàn)一個小siri

    這篇文章主要介紹了關于python利用不到一百行代碼實現(xiàn)了一個小siri的相關資料,文中介紹的很詳細,對大家具有一定的參考借鑒價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • Python實現(xiàn)大文件排序的方法

    Python實現(xiàn)大文件排序的方法

    這篇文章主要介紹了Python大文件排序的方法,涉及Python針對文件、緩存及日期等操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 快速解決jupyter notebook啟動需要密碼的問題

    快速解決jupyter notebook啟動需要密碼的問題

    這篇文章主要介紹了快速解決jupyter notebook啟動需要密碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python實現(xiàn)AES加密解密

    python實現(xiàn)AES加密解密

    這篇文章主要為大家詳細介紹了python實現(xiàn)AES加密解密的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • python遠程連接服務器MySQL數(shù)據(jù)庫

    python遠程連接服務器MySQL數(shù)據(jù)庫

    這篇文章主要為大家詳細介紹了python遠程連接服務器MySQL數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07

最新評論