python3讀取文件指定行的三種方法
行遍歷實現(xiàn)
在python中如果要將一個文件完全加載到內(nèi)存中,通過file.readlines()即可,但是在文件占用較高時,我們是無法完整的將文件加載到內(nèi)存中的,這時候就需要用到python的file.readline()進(jìn)行迭代式的逐行讀?。?/p>
filename = 'hello.txt' with open(filename, 'r') as file: line = file.readline() counts = 1 while line: if counts >= 50000000: break line = file.readline() counts += 1
這里我們的實現(xiàn)方式是先用一個with語句打開一個文件,然后用readline()函數(shù)配合while循環(huán)逐行加載,最終通過一個序號標(biāo)記來結(jié)束循環(huán)遍歷,輸出文件第50000000行的內(nèi)容。該代碼的執(zhí)行效果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m10.359s user 0m10.062s sys 0m0.296s
可以看到這里的耗時為10s多一些。
linecache實現(xiàn)
雖然在python的readline函數(shù)中并沒有實現(xiàn)讀取指定行內(nèi)容的方案,但是在另一個庫linecache中是實現(xiàn)了的,由于使用的方式較為簡單,這里直接放上代碼示例供參考:
filename = 'hello.txt' import linecache text = linecache.getline(filename, 50000000)
該代碼的執(zhí)行結(jié)果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m11.904s user 0m5.672s sys 0m6.231s
雖然在實現(xiàn)方式上簡化了許多,但是我們發(fā)現(xiàn)這個實現(xiàn)的用時超過了11s,還不如我們自己手動實現(xiàn)的循環(huán)遍歷方案。因此如果是對于性能有一定要求的場景,是不建議采用這個方案的。
命令行sed獲取
我們知道用Linux系統(tǒng)本身自帶的sed指令也是可以獲取到文件指定行或者是指定行范圍的數(shù)據(jù)的,其執(zhí)行指令為:sed -n 50000000p filename即表示讀取文件的第50000000行的內(nèi)容。同時結(jié)合python的話,我們可以在python代碼中執(zhí)行系統(tǒng)指令并獲取輸出結(jié)果:
filename = 'hello.txt' import os result = os.popen('sed -n {}p {}'.format(50000000, filename)).read()
需要注意的是,如果直接運行os.system()是沒有返回值的,只有os.popen()是有返回值的,并且需要在尾巴加上一個read()的選項。該代碼的執(zhí)行結(jié)果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m2.532s user 0m0.032s sys 0m0.020s
可以看到直接使用sed指令的執(zhí)行速度很快,但是用這種方法并不是一本萬利的,比如以下這個例子:
filename = 'hello.txt' import os result = os.popen('sed -n {}p {}'.format(500, filename)).read()
我們把讀取第50000000行內(nèi)容改為讀取第500行的內(nèi)容,再運行一次程序:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m2.540s user 0m0.037s sys 0m0.013s
然而我們發(fā)現(xiàn)這個速度并沒有因為要讀取的行數(shù)減少了而變少,而是幾乎保持不變的。
總結(jié)概要
本文通過4個測試案例分析了在python中讀取文件指定行內(nèi)容的方案,并得到了一些運行耗時的數(shù)據(jù)。從需求上來說,如果是對于小規(guī)模的數(shù)據(jù),比如幾百行規(guī)模的數(shù)據(jù),建議使用readline循環(huán)遍歷來操作,速度也相當(dāng)不錯,或者是linecache中的函數(shù)實現(xiàn)也是可以的,甚至可以直接用readlines將整個文本內(nèi)容加載到內(nèi)存中。但是對于數(shù)據(jù)規(guī)模比較大的場景,比如超過了千萬行的級別,那么使用sed指令的方式對指定行內(nèi)容進(jìn)行讀取的方式,應(yīng)該是所有方式中最快速的。
本文首發(fā)鏈接為:https://www.cnblogs.com/dechinphy/p/lbl.html
作者ID:DechinPhy
以上就是python3讀取文件指定行的三種方法的詳細(xì)內(nèi)容,更多關(guān)于python讀取文件指定行的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于tkinter中ttk控件的width-height設(shè)置方式
這篇文章主要介紹了基于tkinter中ttk控件的width-height設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05python 如何使用find和find_all爬蟲、找文本的實現(xiàn)
這篇文章主要介紹了python 如何使用find和find_all,爬蟲、找文本,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10面向新手解析python Beautiful Soup基本用法
這篇文章主要介紹了面向新手解析python Beautiful Soup基本用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07Python全棧之文件函數(shù)和函數(shù)參數(shù)
這篇文章主要為大家介紹了Python的文件函數(shù)和函數(shù)參數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-12-12python使用xlsx和pandas處理Excel表格的操作步驟
python的神器pandas庫就可以非常方便地處理excel,csv,矩陣,表格 等數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于python使用xlsx和pandas處理Excel表格的操作步驟,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01vscode autopep8無法格式化python代碼問題解決
這篇文章主要為大家介紹了vscode autopep8無法格式化python代碼問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Python實現(xiàn)打印九九乘法表的不同方法總結(jié)
這篇文章主要為大家介紹了Python實現(xiàn)打印九九乘法表的幾種不同方法,文中的示例代碼講解詳細(xì),簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11