濮阳杆衣贸易有限公司

主頁 > 知識庫 > python3讀取文件指定行的三種方法

python3讀取文件指定行的三種方法

熱門標簽:地圖標注線上如何操作 河北防封卡電銷卡 應(yīng)電話機器人打電話違法嗎 400電話辦理哪種 開封自動外呼系統(tǒng)怎么收費 開封語音外呼系統(tǒng)代理商 手機網(wǎng)頁嵌入地圖標注位置 電銷機器人的風(fēng)險 天津電話機器人公司

行遍歷實現(xiàn)

在python中如果要將一個文件完全加載到內(nèi)存中,通過file.readlines()即可,但是在文件占用較高時,我們是無法完整的將文件加載到內(nèi)存中的,這時候就需要用到python的file.readline()進行迭代式的逐行讀?。?/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)逐行加載,最終通過一個序號標記來結(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)容進行讀取的方式,應(yīng)該是所有方式中最快速的。

本文首發(fā)鏈接為:https://www.cnblogs.com/dechinphy/p/lbl.html

作者ID:DechinPhy

以上就是python3讀取文件指定行的三種方法的詳細內(nèi)容,更多關(guān)于python讀取文件指定行的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • python 利用openpyxl讀取Excel表格中指定的行或列教程
  • Python fileinput模塊如何逐行讀取多個文件
  • Python 整行讀取文本方法并去掉readlines換行\(zhòng)n操作
  • python讀取excel進行遍歷/xlrd模塊操作
  • 如何在Python對Excel進行讀取
  • 使用Python對Dicom文件進行讀取與寫入的實現(xiàn)
  • python讀取文件指定行內(nèi)容實例講解
  • Python逐行讀取文件內(nèi)容的方法總結(jié)
  • Python從文件中讀取指定的行以及在文件指定位置寫入
  • python按行讀取文件并找出其中指定字符串

標簽:江蘇 駐馬店 蘭州 山東 六盤水 宿遷 常州 成都

巨人網(wǎng)絡(luò)通訊聲明:本文標題《python3讀取文件指定行的三種方法》,本文關(guān)鍵詞  python3,讀取,文件,指定,行的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python3讀取文件指定行的三種方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于python3讀取文件指定行的三種方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    青冈县| 樟树市| 万山特区| 胶州市| 东兰县| 德庆县| 彩票| 册亨县| 诸城市| 同仁县| 汾阳市| 南木林县| 义马市| 行唐县| 浦县| 奉新县| 闻喜县| 石狮市| 崇文区| 台东县| 石首市| 蒙山县| 华亭县| 大埔区| 聂拉木县| 桦川县| 新邵县| 油尖旺区| 井研县| 望江县| 鲁山县| 葵青区| 攀枝花市| 钟祥市| 建水县| 南昌市| 北宁市| 游戏| 桐城市| 射洪县| 涿鹿县|