python读取文件_python这么受欢迎,你知道如何以正确的方式来读取文件内容吗
前言
對(duì)于互聯(lián)網(wǎng)的開發(fā)人員來說,讀取寫入文件幾乎是代碼中常見的一種操作。但是經(jīng)常性的打開關(guān)閉文件,浪費(fèi)資源不說,當(dāng)文件大的時(shí)候讀取的效率也不高。所以今天我們一起看一個(gè)便捷的模塊linecache。linecache顧名思義,就是從內(nèi)存中讀取指定文件的第幾行。本文接下來會(huì)從三個(gè)方面來介紹這個(gè)模塊,相信大家讀了之后會(huì)有一定的知識(shí)收獲
- linecache如何使用
- linecache的源碼分析
- 對(duì)于這個(gè)模塊的一些思考和總結(jié)
注:本文所說的linecache是針對(duì)于python這門語言中自帶的一個(gè)模塊
linecache如何使用
了解python語法的讀者應(yīng)該知道,我們?cè)谑褂靡粋€(gè)模塊的時(shí)候,首先需要把它導(dǎo)入程序中。
1.import linecache
2.from linecache import *
第一種和第二種導(dǎo)入模塊的方法效果是一樣的,具體我們來看看,linecache模塊一共有三個(gè)功能函數(shù)getline(讀取文件的某一行),clearcache(清空已經(jīng)讀到內(nèi)存的文件cache),checkcache(檢查丟掉其中過期的一些cache)。我們重點(diǎn)來看下getline這個(gè)函數(shù)。舉個(gè)例子,假如我們有一個(gè)bytedance.txt文件,文件內(nèi)容如下:
1.welcome to bytedance
2.*********************
3.welcome to toutiao
我們想要獲取第三行的內(nèi)容,如果程序中使用的是第一種模塊導(dǎo)入的方式,那么可以通過linecache.getline("bytedance.txt",3)來直接獲取文件第三行的內(nèi)容。如果使用了第二種模塊導(dǎo)入的方式,那么就是getline("bytedance.txt",3)
linecache的源碼分析
這一塊讓我們具體來看下源碼的內(nèi)容,源碼是怎樣實(shí)現(xiàn)這些功能的函數(shù)呢?
__all__ = ["getline", "clearcache", "checkcache"]
首先源碼中寫明了這個(gè)模塊可以導(dǎo)入的功能函數(shù)有三個(gè),對(duì)于__all__這個(gè)屬性,用來表明這個(gè)模塊中的哪些函數(shù)可以被外部程序?qū)搿?/p>
def getline(filename, lineno, module_globals=None):
lines = getlines(filename, module_globals)
if 1 <= lineno <= len(lines):
return lines[lineno-1]
else:
return ''
我們先來看下getline這個(gè)函數(shù),這個(gè)函數(shù)就是傳入文件名稱,第幾行這兩個(gè)參數(shù)。然后根據(jù)lineno獲取lines的第(lineno-1)個(gè)元素,也就是我們想要讀取的目標(biāo)行。
注:程序中默認(rèn)從0開始計(jì)數(shù),所以讀取lineno行,其實(shí)就是獲取lines[lineno-1]
def getlines(filename, module_globals=None):
"""Get the lines for a file from the cache.
Update the cache if it doesn't contain an entry for this file already."""
if filename in cache:
return cache[filename][2]
try:
return updatecache(filename, module_globals)
except MemoryError:
clearcache()
return []
getline先是調(diào)用getlines這個(gè)函數(shù)獲取文件的所有內(nèi)容。那么getlines這個(gè)函數(shù)又做了哪些邏輯處理呢?兩個(gè)方面,假如讀取的這個(gè)文件已經(jīng)存在cache內(nèi)存中,那么就返回內(nèi)存中的文件內(nèi)容。如果cache中之前沒有讀取這個(gè)文件,那么就需要調(diào)用updatecache這個(gè)函數(shù)重新讀取這個(gè)文件。也就是以下這部分代碼
try:
with open(fullname, 'rU') as fp:
lines = fp.readlines()
except IOError:
return []
對(duì)于這個(gè)模塊的一些思考和總結(jié)
linecache本質(zhì)上就是預(yù)讀,讀取一次文件,然后將讀取到的內(nèi)容和文件名稱作為鍵值對(duì)寫入字典中,之后程序在需要讀取文件內(nèi)容的時(shí)候,就不用重新打開文件讀取內(nèi)容了,可以直接從存儲(chǔ)在內(nèi)存的字典中獲取想要的文件內(nèi)容,非常的方便。那么當(dāng)文件很大,達(dá)到幾百M(fèi)B或者達(dá)到G級(jí)別的時(shí)候,將整個(gè)文件讀取到內(nèi)存中是否合適,這個(gè)時(shí)候開銷會(huì)怎樣呢。毫無疑問,文件特別大的時(shí)候,一次性讀入內(nèi)存的開銷是很大的,如果不需要頻繁的讀取文件,那么不建議將大文件直接一次性的讀取到內(nèi)存中。具體需要怎樣去使用,還是需要貼合我們業(yè)務(wù)場(chǎng)景來決定。
總結(jié)
以上是生活随笔為你收集整理的python读取文件_python这么受欢迎,你知道如何以正确的方式来读取文件内容吗的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云服务器怎么选系统,云服务器怎么选择操作
- 下一篇: 8.0强行转换后变成了7_【建筑通】钻孔