python3讀取文件指定行的三種方法
行遍歷實現
在python中如果要將一個文件完全加載到內存中,通過file.readlines()即可,但是在文件占用較高時,我們是無法完整的將文件加載到內存中的,這時候就需要用到python的file.readline()進行迭代式的逐行讀取:
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
這裡我們的實現方式是先用一個with語句打開一個文件,然後用readline()函數配合while循環逐行加載,最終通過一個序號標記來結束循環遍歷,輸出文件第50000000行的內容。該代碼的執行效果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m10.359s user 0m10.062s sys 0m0.296s
可以看到這裡的耗時為10s多一些。
linecache實現
雖然在python的readline函數中並沒有實現讀取指定行內容的方案,但是在另一個庫linecache中是實現瞭的,由於使用的方式較為簡單,這裡直接放上代碼示例供參考:
filename = 'hello.txt' import linecache text = linecache.getline(filename, 50000000)
該代碼的執行結果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m11.904s user 0m5.672s sys 0m6.231s
雖然在實現方式上簡化瞭許多,但是我們發現這個實現的用時超過瞭11s,還不如我們自己手動實現的循環遍歷方案。因此如果是對於性能有一定要求的場景,是不建議采用這個方案的。
命令行sed獲取
我們知道用Linux系統本身自帶的sed指令也是可以獲取到文件指定行或者是指定行范圍的數據的,其執行指令為:sed -n 50000000p filename即表示讀取文件的第50000000行的內容。同時結合python的話,我們可以在python代碼中執行系統指令並獲取輸出結果:
filename = 'hello.txt' import os result = os.popen('sed -n {}p {}'.format(50000000, filename)).read()
需要註意的是,如果直接運行os.system()是沒有返回值的,隻有os.popen()是有返回值的,並且需要在尾巴加上一個read()的選項。該代碼的執行結果如下:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m2.532s user 0m0.032s sys 0m0.020s
可以看到直接使用sed指令的執行速度很快,但是用這種方法並不是一本萬利的,比如以下這個例子:
filename = 'hello.txt' import os result = os.popen('sed -n {}p {}'.format(500, filename)).read()
我們把讀取第50000000行內容改為讀取第500行的內容,再運行一次程序:
dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py real 0m2.540s user 0m0.037s sys 0m0.013s
然而我們發現這個速度並沒有因為要讀取的行數減少瞭而變少,而是幾乎保持不變的。
總結概要
本文通過4個測試案例分析瞭在python中讀取文件指定行內容的方案,並得到瞭一些運行耗時的數據。從需求上來說,如果是對於小規模的數據,比如幾百行規模的數據,建議使用readline循環遍歷來操作,速度也相當不錯,或者是linecache中的函數實現也是可以的,甚至可以直接用readlines將整個文本內容加載到內存中。但是對於數據規模比較大的場景,比如超過瞭千萬行的級別,那麼使用sed指令的方式對指定行內容進行讀取的方式,應該是所有方式中最快速的。
本文首發鏈接為:https://www.cnblogs.com/dechinphy/p/lbl.html
作者ID:DechinPhy
以上就是python3讀取文件指定行的三種方法的詳細內容,更多關於python讀取文件指定行的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- c++ 實現文件逐行讀取與字符匹配
- python linecache讀取行更新的實現
- 如何在C++中調用Python
- 如何利用Python快速統計文本的行數
- 使用bandit對目標python代碼進行安全函數掃描的案例分析