您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何使用Python讀取大文件,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
背景
最近處理文本文檔時(文件約2GB大小),出現memoryError錯誤和文件讀取太慢的問題,后來找到了兩種比較快Large File Reading 的方法,本文將介紹這兩種讀取方法。
準備工作
我們談到“文本處理”時,我們通常是指處理的內容。Python 將文本文件的內容讀入可以操作的字符串變量非常容易。文件對象提供了三個“讀”方法: .read()、.readline() 和 .readlines()。每種方法可以接受一個變量以限制每次讀取的數據量,但它們通常不使用變量。 .read() 每次讀取整個文件,它通常用于將文件內容放到一個字符串變量中。然而.read() 生成文件內容最直接的字符串表示,但對于連續的面向行的處理,它卻是不必要的,并且如果文件大于可用內存,則不可能實現這種處理。下面是read()方法示例:
try: f = open('/path/to/file', 'r') print f.read() finally: if f: f.close()
調用read()會一次性讀取文件的全部內容,如果文件有10G,內存就爆了,所以,要保險起見,可以反復調用read(size)方法,每次最多讀取size個字節的內容。另外,調用readline()可以每次讀取一行內容,調用readlines()一次讀取所有內容并按行返回list。因此,要根據需要決定怎么調用。
如果文件很小,read()一次性讀取最方便;如果不能確定文件大小,反復調用read(size)
比較保險;如果是配置文件,調用readlines()最方便:
for line in f.readlines(): process(line) #
分塊讀取
處理大文件是很容易想到的就是將大文件分割成若干小文件處理,處理完每個小文件后釋放該部分內存。這里用了iter 和 yield:
def read_in_chunks(filePath, chunk_size=1024*1024): """ Lazy function (generator) to read a file piece by piece. Default chunk size: 1M You can set your own chunk size """ file_object = open(filePath) while True: chunk_data = file_object.read(chunk_size) if not chunk_data: break yield chunk_data if __name__ == "__main__": filePath = './path/filename' for chunk in read_in_chunks(filePath): process(chunk) # <do something with chunk>
使用With open()
with語句打開和關閉文件,包括拋出一個內部塊異常。for line in f文件對象f視為一個迭代器,會自動的采用緩沖IO和內存管理,所以你不必擔心大文件。
代碼如下:
#If the file is line based with open(...) as f: for line in f: process(line) # <do something with line>
優化
面對百萬行的大型數據使用with open 是沒有問題的,但是這里面參數的不同也會導致不同的效率。經過測試發先參數為"rb"時的效率是"r"的6倍。由此可知二進制讀取依然是最快的模式。
with open(filename,"rb") as f: for fLine in f: pass
測試結果:rb方式最快,100w行全遍歷2.9秒。基本能滿足中大型文件處理效率需求。如果從rb(二級制讀取)讀取改為r(讀取模式),慢5-6倍。
結論
在使用python進行大文件讀取時,應該讓系統來處理,使用最簡單的方式,交給解釋器,就管好自己的工作就行了。同時根據不同的需求可以選擇不同的讀取參數進一步獲得更高的性能。
關于“如何使用Python讀取大文件”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。