首頁 >後端開發 >php教程 >使用Python讀取大檔案的方法

使用Python讀取大檔案的方法

不言
不言原創
2018-04-24 15:41:351928瀏覽

這篇文章主要介紹了使用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讀取文字資料並轉換為DataFrame格式的方法詳解################### ###########

以上是使用Python讀取大檔案的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn