熱門文章

      最新文章

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

      發布時間:2021-06-22 15:26:45

      行遍歷實現

      在python中如果要將一個文件完全加載到內存中,通過file.readlines()即可,但是在文件占用較高時,我們是無法完整的將文件加載到內存中的,這時候就需要用到python的file.readline()進行迭代式的逐行讀取:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      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行的內容。該代碼的執行效果如下:

      1
      2
      3
      4
      5
      dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py
       
      real    0m10.359s
      user    0m10.062s
      sys     0m0.296s

      可以看到這里的耗時為10s多一些。

      linecache實現

      雖然在python的readline函數中并沒有實現讀取指定行內容的方案,但是在另一個庫linecache中是實現了的,由于使用的方式較為簡單,這里直接放上代碼示例供參考:

      1
      2
      3
      4
      filename = 'hello.txt'
       
      import linecache
      text = linecache.getline(filename, 50000000)

      該代碼的執行結果如下:

      1
      2
      3
      4
      5
      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代碼中執行系統指令并獲取輸出結果:

      1
      2
      3
      4
      filename = 'hello.txt'
       
      import os
      result = os.popen('sed -n {}p {}'.format(50000000, filename)).read()

      需要注意的是,如果直接運行os.system()是沒有返回值的,只有os.popen()是有返回值的,并且需要在尾巴加上一個read()的選項。該代碼的執行結果如下:

      1
      2
      3
      4
      5
      dechin@ubuntu2004:~/projects/gitlab/dechin/$ time python3 get_line.py
       
      real    0m2.532s
      user    0m0.032s
      sys     0m0.020s

      可以看到直接使用sed指令的執行速度很快,但是用這種方法并不是一本萬利的,比如以下這個例子:

      1
      2
      3
      4
      filename = 'hello.txt'
       
      import os
      result = os.popen('sed -n {}p {}'.format(500, filename)).read()

      我們把讀取第50000000行內容改為讀取第500行的內容,再運行一次程序:

      1
      2
      3
      4
      5
      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指令的方式對指定行內容進行讀取的方式,應該是所有方式中最快速的。


      返回頂部
      主站蜘蛛池模板: 国产Av一区二区精品久久| 老熟女高潮一区二区三区| 夜色阁亚洲一区二区三区| 国产AV午夜精品一区二区三区 | 天天综合色一区二区三区| 中文字幕国产一区| 日韩精品午夜视频一区二区三区| 亚洲乱码日产一区三区 | 2021国产精品一区二区在线| 无码日韩精品一区二区人妻| 女人18毛片a级毛片一区二区| 国产自产对白一区| 国产福利电影一区二区三区,亚洲国模精品一区 | 天堂va视频一区二区| 精品人妻一区二区三区浪潮在线| 国模少妇一区二区三区| asmr国产一区在线| 无码国产亚洲日韩国精品视频一区二区三区 | 亚洲老妈激情一区二区三区| 色狠狠一区二区三区香蕉蜜桃| 国产亚洲欧洲Aⅴ综合一区| 久久AAAA片一区二区| 高清一区二区三区视频| 日韩一区二区三区在线精品| 国产SUV精品一区二区四| 国模无码一区二区三区| 国产天堂一区二区综合| 国产高清精品一区| 久久AAAA片一区二区| 亚洲日本一区二区三区在线| 一区二区乱子伦在线播放| 国产麻豆精品一区二区三区v视界| 中文字幕一区二区三区免费视频 | 国产一区二区三区播放心情潘金莲 | 在线日韩麻豆一区| 乱中年女人伦av一区二区| 日本高清成本人视频一区| 久久久久人妻精品一区二区三区| 91精品国产一区二区三区左线 | 国产一区玩具在线观看| 国产美女视频一区|