【Python】實現對大文件的增量讀取

背景

前段時間在做一個算法測試,需要對數據進行分析才能獲取到結果;而數據來源於日誌,日誌文件較大,所以想要獲取數據的變化曲線,增量讀取是最好的方式。

網上有很多人的技術博客都是寫的用for循環readline以及一個計數器去增量讀取,假如文件很大,遍歷一次太久。而且對於很多大文件的增量讀取,如果遍歷每一行比對歷史記錄的輸出或者全都加載到內存通過歷史記錄的索引查找,是非常浪費資源的,

獲取文件句柄的基本理論中就包含指針操作。linux的文件描述符的struct裏有一個f_pos的這麼個屬性,裏面存着文件當前讀取位置,通過這個東東經過vfs的一系列映射就會得到硬盤存儲的位置了,所以很直接,很快。

在Python中的讀取文件的方法也有類似的屬性。

具體實現

Python中相關方法的核心函數如下:

函數 作用
tell() 返回文件當前位置
seek() 從指定位置開始讀取信息

其中seek()有三種模式:

  • f.seek(p,0) 移動當文件第p個字節處,絕對位置

  • f.seek(p,1) 移動到相對於當前位置之後的p個字節

  • f.seek(p,2) 移動到相對文章尾之後的p個字節

參考代碼:

#!/usr/bin/python
fd=open("test.txt",'r') #獲得一個句柄
for i in xrange(1,3): #讀取三行數據
    fd.readline()
label=fd.tell() #記錄讀取到的位置
fd.close() #關閉文件
#再次閱讀文件
fd=open("test.txt",'r') #獲得一個句柄
fd.seek(label,0)# 把文件讀取指針移動到之前記錄的位置
fd.readline() #接着上次的位置繼續向下讀取

後續

如何得知這個大文件行數,以及變化,我的想法:
方式1: 遍歷’\n’字符。
方式2: 開始時就在for循環中對fd.readline()計數,變化的部分(用上文說的seek、tell函數做)再用for循環fd.readline()進行統計。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章