python3讀取文件指定行的三種方法
在python中如果要將一個(gè)文件完全加載到內(nèi)存中,通過(guò)file.readlines()即可,但是在文件占用較高時(shí),我們是無(wú)法完整的將文件加載到內(nèi)存中的,這時(shí)候就需要用到python的file.readline()進(jìn)行迭代式的逐行讀取:
filename = ’hello.txt’with open(filename, ’r’) as file: line = file.readline() counts = 1 while line:if counts >= 50000000: breakline = file.readline()counts += 1
這里我們的實(shí)現(xiàn)方式是先用一個(gè)with語(yǔ)句打開(kāi)一個(gè)文件,然后用readline()函數(shù)配合while循環(huán)逐行加載,最終通過(guò)一個(gè)序號(hào)標(biāo)記來(lái)結(jié)束循環(huán)遍歷,輸出文件第50000000行的內(nèi)容。該代碼的執(zhí)行效果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m10.359suser 0m10.062ssys 0m0.296s
可以看到這里的耗時(shí)為10s多一些。
linecache實(shí)現(xiàn)雖然在python的readline函數(shù)中并沒(méi)有實(shí)現(xiàn)讀取指定行內(nèi)容的方案,但是在另一個(gè)庫(kù)linecache中是實(shí)現(xiàn)了的,由于使用的方式較為簡(jiǎn)單,這里直接放上代碼示例供參考:
filename = ’hello.txt’import linecachetext = linecache.getline(filename, 50000000)
該代碼的執(zhí)行結(jié)果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m11.904suser 0m5.672ssys 0m6.231s
雖然在實(shí)現(xiàn)方式上簡(jiǎn)化了許多,但是我們發(fā)現(xiàn)這個(gè)實(shí)現(xiàn)的用時(shí)超過(guò)了11s,還不如我們自己手動(dòng)實(shí)現(xiàn)的循環(huán)遍歷方案。因此如果是對(duì)于性能有一定要求的場(chǎng)景,是不建議采用這個(gè)方案的。
命令行sed獲取我們知道用Linux系統(tǒng)本身自帶的sed指令也是可以獲取到文件指定行或者是指定行范圍的數(shù)據(jù)的,其執(zhí)行指令為:sed -n 50000000p filename即表示讀取文件的第50000000行的內(nèi)容。同時(shí)結(jié)合python的話(huà),我們可以在python代碼中執(zhí)行系統(tǒng)指令并獲取輸出結(jié)果:
filename = ’hello.txt’import osresult = os.popen(’sed -n {}p {}’.format(50000000, filename)).read()
需要注意的是,如果直接運(yùn)行os.system()是沒(méi)有返回值的,只有os.popen()是有返回值的,并且需要在尾巴加上一個(gè)read()的選項(xiàng)。該代碼的執(zhí)行結(jié)果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m2.532suser 0m0.032ssys 0m0.020s
可以看到直接使用sed指令的執(zhí)行速度很快,但是用這種方法并不是一本萬(wàn)利的,比如以下這個(gè)例子:
filename = ’hello.txt’import osresult = os.popen(’sed -n {}p {}’.format(500, filename)).read()
我們把讀取第50000000行內(nèi)容改為讀取第500行的內(nèi)容,再運(yùn)行一次程序:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m2.540suser 0m0.037ssys 0m0.013s
然而我們發(fā)現(xiàn)這個(gè)速度并沒(méi)有因?yàn)橐x取的行數(shù)減少了而變少,而是幾乎保持不變的。
總結(jié)概要本文通過(guò)4個(gè)測(cè)試案例分析了在python中讀取文件指定行內(nèi)容的方案,并得到了一些運(yùn)行耗時(shí)的數(shù)據(jù)。從需求上來(lái)說(shuō),如果是對(duì)于小規(guī)模的數(shù)據(jù),比如幾百行規(guī)模的數(shù)據(jù),建議使用readline循環(huán)遍歷來(lái)操作,速度也相當(dāng)不錯(cuò),或者是linecache中的函數(shù)實(shí)現(xiàn)也是可以的,甚至可以直接用readlines將整個(gè)文本內(nèi)容加載到內(nèi)存中。但是對(duì)于數(shù)據(jù)規(guī)模比較大的場(chǎng)景,比如超過(guò)了千萬(wàn)行的級(jí)別,那么使用sed指令的方式對(duì)指定行內(nèi)容進(jìn)行讀取的方式,應(yīng)該是所有方式中最快速的。
本文首發(fā)鏈接為:https://www.cnblogs.com/dechinphy/p/lbl.html
作者ID:DechinPhy
以上就是python3讀取文件指定行的三種方法的詳細(xì)內(nèi)容,更多關(guān)于python讀取文件指定行的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. python excel和yaml文件的讀取封裝2. moment轉(zhuǎn)化時(shí)間戳出現(xiàn)Invalid Date的問(wèn)題及解決3. python爬蟲(chóng)實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊4. Android通用流行框架大全5. Android中的緩存6. Android從按下開(kāi)機(jī)鍵到啟動(dòng)發(fā)生了什么7. 一個(gè)Android項(xiàng)目搞定所有主流架構(gòu)8. Python中內(nèi)建模塊collections如何使用9. Android組件化和插件化開(kāi)發(fā)10. java——Byte類(lèi)/包裝類(lèi)的使用說(shuō)明
